From 8eb807064594e7ac1133f36142e00648bc39b229 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:55:51 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- CMakeLists.txt | 169 + LICENSE.Flora | 206 + NOTICE | 4 + data/CMakeLists.txt | 24 + data/edc_common.h | 122 + data/icon/00_icon_select_all_dim_web.png | Bin 0 -> 4698 bytes data/icon/00_icon_select_all_press_web.png | Bin 0 -> 5114 bytes data/icon/00_icon_select_all_web.png | Bin 0 -> 4729 bytes data/icon/Controlbar/U01_controlbar_cion_home.png | Bin 0 -> 3771 bytes .../Controlbar/U01_controlbar_cion_home_press.png | Bin 0 -> 3830 bytes .../Controlbar/U01_controlbar_cion_up_folder.png | Bin 0 -> 3921 bytes .../U01_controlbar_cion_up_folder_press.png | Bin 0 -> 4007 bytes data/icon/U01_1st_icon_dropbox.png | Bin 0 -> 1771 bytes data/icon/U01_1st_icon_dropbox_press.png | Bin 0 -> 3630 bytes data/icon/U01_1st_icon_external_storage.png | Bin 0 -> 2024 bytes data/icon/U01_1st_icon_external_storage_press.png | Bin 0 -> 3744 bytes data/icon/U01_1st_icon_memory_card.png | Bin 0 -> 1706 bytes data/icon/U01_1st_icon_memory_card_press.png | Bin 0 -> 3503 bytes data/icon/U01_1st_icon_phone.png | Bin 0 -> 1514 bytes data/icon/U01_1st_icon_phone_press.png | Bin 0 -> 3273 bytes data/icon/myfile_icon_USB.png | Bin 0 -> 3891 bytes data/icon/myfile_icon_control_play.png | Bin 0 -> 3032 bytes data/icon/myfile_icon_entry_folder.png | Bin 0 -> 3352 bytes data/icon/myfile_icon_entry_folder_press.png | Bin 0 -> 3078 bytes data/icon/myfile_icon_etc.png | Bin 0 -> 5229 bytes data/icon/myfile_icon_excel.png | Bin 0 -> 5986 bytes data/icon/myfile_icon_folder.png | Bin 0 -> 3799 bytes data/icon/myfile_icon_folder_open.png | Bin 0 -> 4233 bytes data/icon/myfile_icon_html.png | Bin 0 -> 6416 bytes data/icon/myfile_icon_images.png | Bin 0 -> 1454 bytes data/icon/myfile_icon_java.png | Bin 0 -> 3005 bytes data/icon/myfile_icon_mmc.png | Bin 0 -> 3006 bytes data/icon/myfile_icon_mmc_sub.png | Bin 0 -> 691 bytes data/icon/myfile_icon_music.png | Bin 0 -> 4425 bytes data/icon/myfile_icon_pdf.png | Bin 0 -> 4794 bytes data/icon/myfile_icon_phone.png | Bin 0 -> 3028 bytes data/icon/myfile_icon_ppt.png | Bin 0 -> 5417 bytes data/icon/myfile_icon_rss.png | Bin 0 -> 5082 bytes data/icon/myfile_icon_shortcut_default_corner.png | Bin 0 -> 7177 bytes data/icon/myfile_icon_shortcut_document.png | Bin 0 -> 2506 bytes data/icon/myfile_icon_shortcut_document_press.png | Bin 0 -> 2414 bytes data/icon/myfile_icon_shortcut_image.png | Bin 0 -> 2940 bytes data/icon/myfile_icon_shortcut_image_press.png | Bin 0 -> 2847 bytes data/icon/myfile_icon_shortcut_others.png | Bin 0 -> 3068 bytes data/icon/myfile_icon_shortcut_others_press.png | Bin 0 -> 2959 bytes data/icon/myfile_icon_shortcut_sound.png | Bin 0 -> 2844 bytes data/icon/myfile_icon_shortcut_sound_press.png | Bin 0 -> 2732 bytes data/icon/myfile_icon_shortcut_video.png | Bin 0 -> 3831 bytes data/icon/myfile_icon_shortcut_video_press.png | Bin 0 -> 3614 bytes data/icon/myfile_icon_svg.png | Bin 0 -> 5890 bytes data/icon/myfile_icon_swf.png | Bin 0 -> 5653 bytes data/icon/myfile_icon_text.png | Bin 0 -> 4023 bytes data/icon/myfile_icon_video.png | Bin 0 -> 8062 bytes data/icon/myfile_icon_video_play.png | Bin 0 -> 5001 bytes data/icon/myfile_icon_word.png | Bin 0 -> 5865 bytes data/icon/myfile_thumbnail_icon_excel.png | Bin 0 -> 9778 bytes data/icon/myfile_thumbnail_icon_folder.png | Bin 0 -> 4585 bytes data/icon/myfile_thumbnail_icon_folder_open.png | Bin 0 -> 5735 bytes data/icon/myfile_thumbnail_icon_html.png | Bin 0 -> 10712 bytes data/icon/myfile_thumbnail_icon_music.png | Bin 0 -> 7876 bytes data/icon/myfile_thumbnail_icon_pdf.png | Bin 0 -> 7328 bytes data/icon/myfile_thumbnail_icon_ppt.png | Bin 0 -> 8639 bytes data/icon/myfile_thumbnail_icon_rss.png | Bin 0 -> 7469 bytes data/icon/myfile_thumbnail_icon_svg.png | Bin 0 -> 8226 bytes data/icon/myfile_thumbnail_icon_swf.png | Bin 0 -> 9507 bytes data/icon/myfile_thumbnail_icon_text.png | Bin 0 -> 5914 bytes data/icon/myfile_thumbnail_icon_unkown.png | Bin 0 -> 8219 bytes data/icon/myfile_thumbnail_icon_video.png | Bin 0 -> 19631 bytes data/icon/myfile_thumbnail_icon_video_play.png | Bin 0 -> 8407 bytes data/icon/myfile_thumbnail_icon_word.png | Bin 0 -> 10262 bytes data/image/myfile_icon_shortcut_default_corner.png | Bin 0 -> 7177 bytes data/myfile.edc | 1825 +++++++ data/po/CMakeLists.txt | 26 + data/po/POTFILES.in | 14 + data/po/ar.po | 318 ++ data/po/az.po | 318 ++ data/po/bg.po | 318 ++ data/po/ca.po | 318 ++ data/po/cs.po | 318 ++ data/po/da.po | 318 ++ data/po/de_DE.po | 318 ++ data/po/el_GR.po | 318 ++ data/po/en.po | 318 ++ data/po/en_PH.po | 318 ++ data/po/en_US.po | 318 ++ data/po/es_ES.po | 318 ++ data/po/es_MX.po | 318 ++ data/po/es_US.po | 309 ++ data/po/et.po | 318 ++ data/po/eu.po | 318 ++ data/po/fi.po | 318 ++ data/po/fr_CA.po | 318 ++ data/po/fr_FR.po | 318 ++ data/po/ga.po | 318 ++ data/po/gl.po | 318 ++ data/po/hi.po | 318 ++ data/po/hr.po | 318 ++ data/po/hu.po | 318 ++ data/po/hy.po | 318 ++ data/po/is.po | 318 ++ data/po/it_IT.po | 318 ++ data/po/ja_JP.po | 318 ++ data/po/ka.po | 318 ++ data/po/kk.po | 318 ++ data/po/ko_KR.po | 318 ++ data/po/lt.po | 318 ++ data/po/lv.po | 318 ++ data/po/mk.po | 318 ++ data/po/nb.po | 318 ++ data/po/nl_NL.po | 318 ++ data/po/pl.po | 318 ++ data/po/pt_BR.po | 318 ++ data/po/pt_PT.po | 318 ++ data/po/ro.po | 318 ++ data/po/ru_RU.po | 318 ++ data/po/sk.po | 318 ++ data/po/sl.po | 318 ++ data/po/sr.po | 318 ++ data/po/sv.po | 318 ++ data/po/tr_TR.po | 318 ++ data/po/uk.po | 318 ++ data/po/update-po.sh | 57 + data/po/uz.po | 318 ++ data/po/zh_CN.po | 318 ++ data/po/zh_HK.po | 318 ++ data/po/zh_SG.po | 318 ++ data/po/zh_TW.po | 318 ++ desktop/org.tizen.myfile.png | Bin 0 -> 57662 bytes desktop/org.tizen.myfile.xml | 67 + org.tizen.myfile.manifest | 12 + org.tizen.myfile.rule | 214 + packaging/org.tizen.myfile.spec | 83 + src/common/file-operation/mf-cancel.c | 90 + src/common/file-operation/mf-copy-internal.c | 821 ++++ src/common/file-operation/mf-copy.c | 464 ++ src/common/file-operation/mf-delete-internal.c | 290 ++ src/common/file-operation/mf-delete.c | 365 ++ src/common/file-operation/mf-fo-internal.c | 515 ++ src/common/file-operation/mf-move-internal.c | 800 ++++ src/common/file-operation/mf-move.c | 488 ++ src/common/file-operation/mf-request.c | 164 + src/common/file-operation/mf-search-internal.c | 848 ++++ src/common/file-operation/mf-search.c | 137 + src/common/file-system/mf-file-attr.c | 1344 ++++++ src/common/file-system/mf-fs-oper.c | 803 ++++ src/common/mf-callback.c | 4995 ++++++++++++++++++++ src/common/mf-drm.c | 87 + src/common/mf-fm-svc-wrapper.c | 1183 +++++ src/common/mf-inotify-handle.c | 373 ++ src/common/mf-language-mgr.c | 310 ++ src/common/mf-launch.c | 482 ++ src/common/mf-log.c | 80 + src/common/mf-media-content.c | 161 + src/common/mf-otg.c | 685 +++ src/common/mf-s-beam.c | 263 ++ src/common/mf-sensor.c | 148 + src/common/mf-share.c | 181 + src/common/mf-ta.c | 544 +++ src/common/mf-util.c | 1579 +++++++ src/include/mf-callback.h | 126 + src/include/mf-cancel.h | 83 + src/include/mf-conf.h | 65 + src/include/mf-copy-internal.h | 42 + src/include/mf-copy.h | 51 + src/include/mf-delete-internal.h | 36 + src/include/mf-delete.h | 45 + src/include/mf-dlog.h | 116 + src/include/mf-drm.h | 34 + src/include/mf-fm-svc-wrapper.h | 81 + src/include/mf-fo-common.h | 126 + src/include/mf-fo-debug.h | 68 + src/include/mf-fo-internal.h | 39 + src/include/mf-fs-util.h | 414 ++ src/include/mf-gadget.h | 33 + src/include/mf-gengrid.h | 51 + src/include/mf-inotify-handle.h | 45 + src/include/mf-language-mgr.h | 60 + src/include/mf-launch.h | 44 + src/include/mf-log.h | 36 + src/include/mf-main.h | 419 ++ src/include/mf-media-content.h | 40 + src/include/mf-move-internal.h | 39 + src/include/mf-move.h | 51 + src/include/mf-otg.h | 186 + src/include/mf-request.h | 139 + src/include/mf-resource.h | 171 + src/include/mf-s-beam.h | 43 + src/include/mf-search-internal.h | 78 + src/include/mf-search.h | 225 + src/include/mf-sensor.h | 36 + src/include/mf-share.h | 42 + src/include/mf-split-view.h | 33 + src/include/mf-ta.h | 130 + src/include/mf-tray-item.h | 57 + src/include/mf-util.h | 302 ++ src/include/mf-widget.h | 399 ++ src/mf-main.c | 974 ++++ src/widget/mf-content.c | 68 + src/widget/mf-context-popup.c | 343 ++ src/widget/mf-ctrl-bar.c | 593 +++ src/widget/mf-gengrid.c | 626 +++ src/widget/mf-genlist.c | 1843 ++++++++ src/widget/mf-navi-bar.c | 2039 ++++++++ src/widget/mf-popup.c | 806 ++++ src/widget/mf-search-bar.c | 689 +++ src/widget/mf-split-view.c | 356 ++ src/widget/mf-tab-bar.c | 334 ++ src/widget/mf-tray-item.c | 294 ++ src/widget/mf-widget.c | 699 +++ 209 files changed, 51199 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100644 data/CMakeLists.txt create mode 100644 data/edc_common.h create mode 100644 data/icon/00_icon_select_all_dim_web.png create mode 100644 data/icon/00_icon_select_all_press_web.png create mode 100644 data/icon/00_icon_select_all_web.png create mode 100644 data/icon/Controlbar/U01_controlbar_cion_home.png create mode 100644 data/icon/Controlbar/U01_controlbar_cion_home_press.png create mode 100644 data/icon/Controlbar/U01_controlbar_cion_up_folder.png create mode 100644 data/icon/Controlbar/U01_controlbar_cion_up_folder_press.png create mode 100644 data/icon/U01_1st_icon_dropbox.png create mode 100644 data/icon/U01_1st_icon_dropbox_press.png create mode 100644 data/icon/U01_1st_icon_external_storage.png create mode 100644 data/icon/U01_1st_icon_external_storage_press.png create mode 100644 data/icon/U01_1st_icon_memory_card.png create mode 100644 data/icon/U01_1st_icon_memory_card_press.png create mode 100644 data/icon/U01_1st_icon_phone.png create mode 100644 data/icon/U01_1st_icon_phone_press.png create mode 100644 data/icon/myfile_icon_USB.png create mode 100644 data/icon/myfile_icon_control_play.png create mode 100644 data/icon/myfile_icon_entry_folder.png create mode 100644 data/icon/myfile_icon_entry_folder_press.png create mode 100644 data/icon/myfile_icon_etc.png create mode 100644 data/icon/myfile_icon_excel.png create mode 100644 data/icon/myfile_icon_folder.png create mode 100644 data/icon/myfile_icon_folder_open.png create mode 100644 data/icon/myfile_icon_html.png create mode 100644 data/icon/myfile_icon_images.png create mode 100644 data/icon/myfile_icon_java.png create mode 100644 data/icon/myfile_icon_mmc.png create mode 100644 data/icon/myfile_icon_mmc_sub.png create mode 100644 data/icon/myfile_icon_music.png create mode 100644 data/icon/myfile_icon_pdf.png create mode 100644 data/icon/myfile_icon_phone.png create mode 100644 data/icon/myfile_icon_ppt.png create mode 100644 data/icon/myfile_icon_rss.png create mode 100644 data/icon/myfile_icon_shortcut_default_corner.png create mode 100644 data/icon/myfile_icon_shortcut_document.png create mode 100644 data/icon/myfile_icon_shortcut_document_press.png create mode 100644 data/icon/myfile_icon_shortcut_image.png create mode 100644 data/icon/myfile_icon_shortcut_image_press.png create mode 100644 data/icon/myfile_icon_shortcut_others.png create mode 100644 data/icon/myfile_icon_shortcut_others_press.png create mode 100644 data/icon/myfile_icon_shortcut_sound.png create mode 100644 data/icon/myfile_icon_shortcut_sound_press.png create mode 100644 data/icon/myfile_icon_shortcut_video.png create mode 100644 data/icon/myfile_icon_shortcut_video_press.png create mode 100644 data/icon/myfile_icon_svg.png create mode 100644 data/icon/myfile_icon_swf.png create mode 100644 data/icon/myfile_icon_text.png create mode 100644 data/icon/myfile_icon_video.png create mode 100644 data/icon/myfile_icon_video_play.png create mode 100644 data/icon/myfile_icon_word.png create mode 100644 data/icon/myfile_thumbnail_icon_excel.png create mode 100644 data/icon/myfile_thumbnail_icon_folder.png create mode 100644 data/icon/myfile_thumbnail_icon_folder_open.png create mode 100644 data/icon/myfile_thumbnail_icon_html.png create mode 100644 data/icon/myfile_thumbnail_icon_music.png create mode 100644 data/icon/myfile_thumbnail_icon_pdf.png create mode 100644 data/icon/myfile_thumbnail_icon_ppt.png create mode 100644 data/icon/myfile_thumbnail_icon_rss.png create mode 100644 data/icon/myfile_thumbnail_icon_svg.png create mode 100644 data/icon/myfile_thumbnail_icon_swf.png create mode 100644 data/icon/myfile_thumbnail_icon_text.png create mode 100644 data/icon/myfile_thumbnail_icon_unkown.png create mode 100644 data/icon/myfile_thumbnail_icon_video.png create mode 100644 data/icon/myfile_thumbnail_icon_video_play.png create mode 100644 data/icon/myfile_thumbnail_icon_word.png create mode 100644 data/image/myfile_icon_shortcut_default_corner.png create mode 100644 data/myfile.edc create mode 100644 data/po/CMakeLists.txt create mode 100644 data/po/POTFILES.in create mode 100644 data/po/ar.po create mode 100644 data/po/az.po create mode 100644 data/po/bg.po create mode 100644 data/po/ca.po create mode 100644 data/po/cs.po create mode 100644 data/po/da.po create mode 100644 data/po/de_DE.po create mode 100644 data/po/el_GR.po create mode 100644 data/po/en.po create mode 100644 data/po/en_PH.po create mode 100644 data/po/en_US.po create mode 100644 data/po/es_ES.po create mode 100644 data/po/es_MX.po create mode 100644 data/po/es_US.po create mode 100644 data/po/et.po create mode 100644 data/po/eu.po create mode 100644 data/po/fi.po create mode 100644 data/po/fr_CA.po create mode 100644 data/po/fr_FR.po create mode 100644 data/po/ga.po create mode 100644 data/po/gl.po create mode 100644 data/po/hi.po create mode 100644 data/po/hr.po create mode 100644 data/po/hu.po create mode 100644 data/po/hy.po create mode 100644 data/po/is.po create mode 100644 data/po/it_IT.po create mode 100644 data/po/ja_JP.po create mode 100644 data/po/ka.po create mode 100644 data/po/kk.po create mode 100644 data/po/ko_KR.po create mode 100644 data/po/lt.po create mode 100644 data/po/lv.po create mode 100644 data/po/mk.po create mode 100644 data/po/nb.po create mode 100644 data/po/nl_NL.po create mode 100644 data/po/pl.po create mode 100644 data/po/pt_BR.po create mode 100644 data/po/pt_PT.po create mode 100644 data/po/ro.po create mode 100644 data/po/ru_RU.po create mode 100644 data/po/sk.po create mode 100644 data/po/sl.po create mode 100644 data/po/sr.po create mode 100644 data/po/sv.po create mode 100644 data/po/tr_TR.po create mode 100644 data/po/uk.po create mode 100644 data/po/update-po.sh create mode 100644 data/po/uz.po create mode 100644 data/po/zh_CN.po create mode 100644 data/po/zh_HK.po create mode 100644 data/po/zh_SG.po create mode 100644 data/po/zh_TW.po create mode 100755 desktop/org.tizen.myfile.png create mode 100644 desktop/org.tizen.myfile.xml create mode 100644 org.tizen.myfile.manifest create mode 100755 org.tizen.myfile.rule create mode 100755 packaging/org.tizen.myfile.spec create mode 100644 src/common/file-operation/mf-cancel.c create mode 100644 src/common/file-operation/mf-copy-internal.c create mode 100644 src/common/file-operation/mf-copy.c create mode 100644 src/common/file-operation/mf-delete-internal.c create mode 100644 src/common/file-operation/mf-delete.c create mode 100644 src/common/file-operation/mf-fo-internal.c create mode 100644 src/common/file-operation/mf-move-internal.c create mode 100644 src/common/file-operation/mf-move.c create mode 100644 src/common/file-operation/mf-request.c create mode 100644 src/common/file-operation/mf-search-internal.c create mode 100644 src/common/file-operation/mf-search.c create mode 100644 src/common/file-system/mf-file-attr.c create mode 100644 src/common/file-system/mf-fs-oper.c create mode 100644 src/common/mf-callback.c create mode 100644 src/common/mf-drm.c create mode 100644 src/common/mf-fm-svc-wrapper.c create mode 100644 src/common/mf-inotify-handle.c create mode 100644 src/common/mf-language-mgr.c create mode 100644 src/common/mf-launch.c create mode 100644 src/common/mf-log.c create mode 100644 src/common/mf-media-content.c create mode 100644 src/common/mf-otg.c create mode 100644 src/common/mf-s-beam.c create mode 100644 src/common/mf-sensor.c create mode 100644 src/common/mf-share.c create mode 100644 src/common/mf-ta.c create mode 100644 src/common/mf-util.c create mode 100644 src/include/mf-callback.h create mode 100644 src/include/mf-cancel.h create mode 100644 src/include/mf-conf.h create mode 100644 src/include/mf-copy-internal.h create mode 100644 src/include/mf-copy.h create mode 100644 src/include/mf-delete-internal.h create mode 100644 src/include/mf-delete.h create mode 100644 src/include/mf-dlog.h create mode 100644 src/include/mf-drm.h create mode 100644 src/include/mf-fm-svc-wrapper.h create mode 100644 src/include/mf-fo-common.h create mode 100644 src/include/mf-fo-debug.h create mode 100644 src/include/mf-fo-internal.h create mode 100644 src/include/mf-fs-util.h create mode 100644 src/include/mf-gadget.h create mode 100644 src/include/mf-gengrid.h create mode 100644 src/include/mf-inotify-handle.h create mode 100644 src/include/mf-language-mgr.h create mode 100644 src/include/mf-launch.h create mode 100644 src/include/mf-log.h create mode 100644 src/include/mf-main.h create mode 100644 src/include/mf-media-content.h create mode 100644 src/include/mf-move-internal.h create mode 100644 src/include/mf-move.h create mode 100644 src/include/mf-otg.h create mode 100644 src/include/mf-request.h create mode 100644 src/include/mf-resource.h create mode 100644 src/include/mf-s-beam.h create mode 100644 src/include/mf-search-internal.h create mode 100644 src/include/mf-search.h create mode 100644 src/include/mf-sensor.h create mode 100644 src/include/mf-share.h create mode 100644 src/include/mf-split-view.h create mode 100644 src/include/mf-ta.h create mode 100644 src/include/mf-tray-item.h create mode 100644 src/include/mf-util.h create mode 100644 src/include/mf-widget.h create mode 100644 src/mf-main.c create mode 100644 src/widget/mf-content.c create mode 100644 src/widget/mf-context-popup.c create mode 100644 src/widget/mf-ctrl-bar.c create mode 100644 src/widget/mf-gengrid.c create mode 100644 src/widget/mf-genlist.c create mode 100644 src/widget/mf-navi-bar.c create mode 100644 src/widget/mf-popup.c create mode 100644 src/widget/mf-search-bar.c create mode 100644 src/widget/mf-split-view.c create mode 100644 src/widget/mf-tab-bar.c create mode 100644 src/widget/mf-tray-item.c create mode 100644 src/widget/mf-widget.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d1feb0c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,169 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(myfile C) + +SET(DEBFILE_NAME org.tizen.myfile) + +#SET(MFDUGNAME ug-myfile-detail-efl) +# End for myfile ug + +SET(SRC-DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) +SET(UTILITY-DIR ${SRC-DIR}/common) +SET(FS-DIR ${UTILITY-DIR}/file-system) +SET(FO-DIR ${UTILITY-DIR}/file-operation) +SET(WIDGET-DIR ${SRC-DIR}/widget) + +SET(MAININCLUDE ${SRC-DIR}/include) + +SET(PKG_NAME "${CMAKE_INSTALL_PKG_NAME}") +SET(DESKTOP_DIR ${CMAKE_DESKTOP_DIR}) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(LIBDIR "/usr/lib") +SET(RESDIR "${PREFIX}/res") +SET(DATADIR "${CMAKE_INSTALL_DATA_DIR}") +SET(LOCALEDIR "${RESDIR}/locale") +SET(ICONDIR "${RESDIR}/icons/default/small") +SET(IMAGEDIR "${RESDIR}/images") +SET(EDJDIR "${RESDIR}/edje") +SET(XMLDIR "/usr/share/packages") +#SET(ADD_SEARCH_MODULE 1) ##value is not meaningful one + +#MYFILE_ADD_TO_HOME + +INCLUDE_DIRECTORIES(${MAININCLUDE}) + +SET(SRCS + ${SRC-DIR}/mf-main.c + ${UTILITY-DIR}/mf-callback.c + ${UTILITY-DIR}/mf-util.c + ${UTILITY-DIR}/mf-ta.c + ${UTILITY-DIR}/mf-fm-svc-wrapper.c + ${UTILITY-DIR}/mf-inotify-handle.c + ${UTILITY-DIR}/mf-launch.c + ${UTILITY-DIR}/mf-otg.c + ${UTILITY-DIR}/mf-log.c + ${UTILITY-DIR}/mf-language-mgr.c + ${UTILITY-DIR}/mf-s-beam.c + ${UTILITY-DIR}/mf-sensor.c + ${UTILITY-DIR}/mf-share.c + ${UTILITY-DIR}/mf-drm.c + ${UTILITY-DIR}/mf-media-content.c +########### File system related ########## + ${FS-DIR}/mf-file-attr.c + ${FS-DIR}/mf-fs-oper.c + +########### File operation related ########## + ${FO-DIR}/mf-cancel.c + ${FO-DIR}/mf-copy.c + ${FO-DIR}/mf-copy-internal.c + ${FO-DIR}/mf-delete.c + ${FO-DIR}/mf-delete-internal.c + ${FO-DIR}/mf-fo-internal.c + ${FO-DIR}/mf-move.c + ${FO-DIR}/mf-move-internal.c + ${FO-DIR}/mf-request.c + ${FO-DIR}/mf-search.c + ${FO-DIR}/mf-search-internal.c + +########### Widget related ########## +# ${WIDGET-DIR}/mf-tab-bar.c + ${WIDGET-DIR}/mf-ctrl-bar.c + ${WIDGET-DIR}/mf-search-bar.c + ${WIDGET-DIR}/mf-navi-bar.c + ${WIDGET-DIR}/mf-genlist.c +# ${WIDGET-DIR}/mf-content.c + ${WIDGET-DIR}/mf-popup.c + ${WIDGET-DIR}/mf-split-view.c + ${WIDGET-DIR}/mf-widget.c + ${WIDGET-DIR}/mf-gengrid.c + ${WIDGET-DIR}/mf-context-popup.c + ${WIDGET-DIR}/mf-tray-item.c + + ) + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED +capi-appfw-application +capi-content-media-content +elementary +vconf +glib-2.0 +gthread-2.0 +drm-client +ui-gadget-1 +dlog +ecore-imf +ecore-x +eina +evas +edje +ecore +ecore-file +ecore-input +icu-i18n +icu-io +icu-le +icu-lx +icu-uc +capi-system-power +capi-system-runtime-info +capi-network-nfc +capi-system-sensor +syspopup-caller +status +) +# org.tizen.live-myfile +# debian + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) +#SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -finstrument-functions") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -D_BSD_SOURCE=1 -D_XOPEN_SOURCE=600 -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fpie") +SET(CMAKE_C_FLAGS_RELEASE "-O2 -Wall -g -fpie") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") +ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"") +ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"") +ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"") + + +ADD_DEFINITIONS("-DFACTORYFS=\"$ENV{FACTORYFS}\"") +ADD_DEFINITIONS("-DMYFILE_USE_LOG") +ADD_DEFINITIONS("-DMYFILE_USE_TA") +ADD_DEFINITIONS("-DMYFILE_USB_OTG") +#ADD_DEFINITIONS("-DMYFILE_CRITICAL_LOG") +#ADD_DEFINITIONS("-DMYFILE_SPLIT_VIEW") +ADD_DEFINITIONS("-DMYFILE_MOTION_FEATURE") +ADD_DEFINITIONS("-DMYFILE_TRAY_FEATURE") + + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +#ADD_EXECUTABLE(FSTest ${LIB_SRCS}) +#ADD_LIBRARY(${PROJECT_NAME}_fs SHARED ${LIB_SRCS}) +#TARGET_LINK_LIBRARIES(FSTest ${pkgs_LDFLAGS}) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lm -lpthread) + +INSTALL(TARGETS ${PROJECT_NAME} ${LIBNAME} + RUNTIME DESTINATION ${BINDIR} + LIBRARY DESTINATION ${LIBDIR}) +#INSTALL(FILES ${CMAKE_SOURCE_DIR}/tools/dumpfiles.sh DESTINATION bin) +#INSTALL(FILES ${MAININCLUDE}/myfile_filesystem_util.h DESTINATION /usr/include) +INSTALL(DIRECTORY DESTINATION ${DATADIR}) + +#CONFIGURE_FILE(desktop/${PKG_NAME}.desktop.in desktop/${PKG_NAME}.desktop) +INSTALL(FILES ${CMAKE_BINARY_DIR}/desktop/${PKG_NAME}.xml DESTINATION ${XMLDIR}) + +INSTALL(FILES desktop/${PKG_NAME}.png DESTINATION ${CMAKE_DESKTOP_ICON_DIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.myfile.rule DESTINATION /opt/etc/smack/accesses.d) + +ADD_SUBDIRECTORY(data) + +#End for myfile ug diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..dd1765b --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. + +You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text +from the Work, provided that such additional attribution notices +cannot be construed as modifying the License. You may add Your own +copyright statement to Your modifications and may provide additional or +different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works +as a whole, provided Your use, reproduction, and distribution of +the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..b6ec43b --- /dev/null +++ b/NOTICE @@ -0,0 +1,4 @@ +Copyright (c) Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Flora License, Version 1.1 +Please, see the LICENSE.Flora file for Flora License, Version 1.1 terms and conditions. + diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..f582af6 --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1,24 @@ + +ADD_CUSTOM_TARGET(myfile.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/image + ${CMAKE_SOURCE_DIR}/data/myfile.edc ${CMAKE_BINARY_DIR}/data/myfile.edj + DEPENDS ${CMAKE_SOURCE_DIR}/data/myfile.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} myfile.edj) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/data/myfile.edj DESTINATION ${EDJDIR}) + +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/icon/ DESTINATION ${IMAGEDIR} FILES_MATCHING PATTERN "*.png" +PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_WRITE +WORLD_EXECUTE) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/icon/ DESTINATION ${IMAGEDIR} FILES_MATCHING PATTERN "*.PNG" +PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_WRITE +WORLD_EXECUTE) + + +# install desktop file & icon + + +# i18n +ADD_SUBDIRECTORY(po) + diff --git a/data/edc_common.h b/data/edc_common.h new file mode 100644 index 0000000..d936240 --- /dev/null +++ b/data/edc_common.h @@ -0,0 +1,122 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define SHORTCUT_W 720 +#define SHORTCUT_H 96 +#define SHORTCUT_ADD 130 +#define SHORTCUT_IMG_ORI 64 +#define SHORTCUT_IMG_ORI_Y 12 +#define SHORTCUT_BLINE 164 +#define SHORTCUT_WLINE 165 +#define SHORTCUT_Y 23 + + +#define BASIC_W 480 +#define BASIC_H 800 + +#define MAIN_W 720 +#define MAIN_H 1280 + +#define MF_SCALE_W (MAIN_W/BASIC_W) +#define MF_SCALE_H (MAIN_H/BASIC_H) + +#define FONT_NANE "Tizen:style=Medium" +#define FONT_LIST_ITEM "Tizen:style=Roman" + +#define FONT_SIZE 22 +#define FONT_COLOR 255 255 255 255 + +#define MAIN_FONT_STYLE "Tizen" +#define MAIN_FONT_SIZE 32 +#define MAIN_FONT_COLOR 255 255 255 255 + +#define SUB_FONT "Tizen" +#define SUB_FONT_SIZE 18 +#define SUB_FONT_COLOR 149 149 149 + + +#define DIR_CLASS_NAME "myfile_dir" +#define DIR_SIZE 42 + + +#define THUMBNAIL_W 50*MF_SCALE_W +#define THUMBNAIL_H 50*MF_SCALE_H + +#define MEMORY_SUB_THUMB_W 40*MF_SCALE_W +#define MEMORY_SUB_THUMB_H 25*MF_SCALE_H + + +#define GENLIST_ITEM_H 71*MF_SCALE_H +#define PATH_INFO_H 48 +#define PATH_INFO_LABEL_H 25 +#define PATH_INFO_BG_COLOR 68 68 68 255 + +#define BOTTOM_LINE_COLOR 199 199 199 255 + +#define BTN_W 60 +#define BTN_H 61 +#define INDICATOR_H 46 +#define SOFTKEY_H 96 +#define BUTTON_W 80 +#define CHECK_R 50 +#define SUB_W 104 +#define SUB_H 32 + +#define SEARCHBAR_BACKGROUND_COLOR_DEFAULT 36 36 36 255 + + +#define EDITFIELD_CANCEL_BUTTON_WITH_PADDING_W_INC 150 +#define EDITFIELD_TOP_PADDING_INC 18 +#define EDITFIELD_BOTTOM_PADDING_INC 18 +#define EDITFIELD_HEIGHT_INC 74 +#define EDITFIELD_LEFT_PADDING_INC 30 +#define EDITFIELD_RIGHT_PADDING_INC 5 + +#define SEARCHBAR_HEIGHT_INC 74 +#define SEARCHBAR_INPUTFIELD_BORDER_INC 6 6 6 6 +#define SEARCHBAR_LEFT_ICON_PADDING_INC 16 +#define SEARCHBAR_ICON_MIN_W_INC 42 +#define SEARCHBAR_ICON_MIN_H_INC 42 +#define SEARCHBAR_LEFT_PADDING_SEARCHFIELD_INC 16 +#define SEARCHBAR_RIGHT_PADDING_SEARCHFIELD_INC 8 +#define SEARCHBAR_SEARCH_TEXTFIELD_H_INC 60 +#define SEARCHBAR_H_INC 107 +#define EDITFIELD_SEARCHBAR_TOP1_SINGLE_INC 6 +#define EDITFIELD_SEARCHBAR_TOP1_MULTI_INC 10 +#define EDITFIELD_SEARCHBAR_TOP2_INC 10 +#define EDITFIELD_SEARCHBAR_LEFT1_INC 0 +#define EDITFIELD_SEARCHBAR_LEFT2_INC 0 +#define EDITFIELD_SEARCHBAR_LEFT3_INC 1 +#define EDITFIELD_SEARCHBAR_RIGHT1_ERASER_SHOW_INC 56 +#define EDITFIELD_SEARCHBAR_RIGHT2_INC 5 +#define EDITFIELD_SEARCHBAR_BOTTOM1_SINGLE_INC 8 +#define EDITFIELD_SEARCHBAR_BOTTOM1_MULTI_INC 2 +#define EDITFIELD_SEARCHBAR_BOTTOM2_SINGLE_INC 16 +#define EDITFIELD_SEARCHBAR_BOTTOM2_MULTI_INC 2 +#define EDITFIELD_SEARCHBAR_BOTTOM3_SINGLE_INC 50 +#define EDITFIELD_SEARCHBAR_BOTTOM3_MULTI_INC 50 + + +#define MF_SEARCH_FOLDER_H 300*MF_SCALE_H +#define MF_SEARCH_FOLDER_W 400*MF_SCALE_H +#define DEFAULT_COLOR 248 246 239 255 + +/********* group index ************/ +#define GENLIST_GROUPINDEX_LIST_PRESS_COLOR 132 162 198 255 +#define GENLIST_GROUPINDEX_LIST_COLOR 59 115 182 255 +#define GENLIST_GROUPINDEX_LIST_FOCUS_COLOR 255 255 255 255 +#define GENLIST_GROUPINDEX_LINE_COLOR 59 115 182 255 +#define GENLIST_GROUPINDEX_LINE_FOCUS_COLOR 255 255 255 255 + diff --git a/data/icon/00_icon_select_all_dim_web.png b/data/icon/00_icon_select_all_dim_web.png new file mode 100644 index 0000000000000000000000000000000000000000..46518d7d546339cb81df6b0694b7390cb174df1d GIT binary patch literal 4698 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 Hu0mjfnQ!hX literal 0 HcmV?d00001 diff --git a/data/icon/Controlbar/U01_controlbar_cion_home.png b/data/icon/Controlbar/U01_controlbar_cion_home.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5fc58553e16d14b819da9ae709b3fb40124c9d GIT binary patch literal 3771 zcmV;s4n*;ZP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000B#NklbkXZ#7IGGIaplgPxUv=ox)J7n z1wVicvzXn$ZMSlT`2akSm)w++s5W5$8sJhwB_{S z>5tRoIj4!x>-E6nzX)&w4#Gh=2nXRH9E5{#5DvmYUPF*^6UegcMjbT(WdL;m>rOtX zX&PG~SkVfM_%dNs{`*d_f_sU;tnOg|LG0*a!HG zLRi9J0fn%J;Wr9l5yMXu!YYPeD1>DUKTrtk7{gGUu6;ZQ`4$+1P*hb#v)No{669NA zc!fe<6NVQkZh$03QT#0)kALq4#t@V@mSw%wH0}1Kd4+NQ>{b*dDT-nvkw}zsxtwPh zUxsblxWB*0)zuX)E-uh+w?CSu`S$GW?AB8dMNyK3kVZ0@EamfgWHK2!H)>;QIO+nx?%N#WBcJ zjBGZGP$=XphMOpXNx=XBK@boMg^yzcGRaBi;IhxpP$Fk(b32=#{R3 z@3B~HWDvtJ0HD6Qx>{CM^|4+-5KygFK`B*T0Rd2|MVSzKcB1D&DCx{*$)7I?Z0+{;c+}$uiMN2 z+Ng;cLUB|tzhH)ga1i!Ewzs!`0?-@b;d%IRIRs*{7}Du92K6C{L;}HJaPmPyp%8Mp z98#&&z&;}w3?dSVOg;!91WwvKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000CbNklav zkw*zY5x^Ay(@ws)v3QLxkiMHJ5laF2SWyraw2f-9Ra=K;8q){1h4hOd#YT$ZlamnD zK^Xd9*jk+{HYzK=p%A|@qUp1U44+0&iJ@7ofF~gU@C}8~fFVW`;CKQtnm}aubf=gv zD1;Ua092q5S};1{HwvK%g9a2r8;0K~ghmWMQ3$OVexVSWG5kOwv}1Hbak}>L9OQ9e z?1geH`vTT){y0q~$m7KD3WXdb3@=dJ$XMlx_^lKhIp+mN7nE_!H1ZpZ*YthY+s~if zS|+awL8&aoQn_gAS%gncdV=wA*p>-na}8U!f5YbTFKGO|Jl}5C^Baq0-BS=PlUD^% zDIbYva%%bvl%a71BLkjdJdDz+R#3e=4}Ixp)YcZ}+eUR?DEk8GV91HloSMl)8O$Ld z9|gw?zHK(ywgt1cfvvm0LtiZK8^tlmqZr|#2@qKW$N9fs?FI^eSTF#9<9HBRLwINc zY9AIAB6yw#Wc$^vGaecMb^N?$q z22vV_@xktwwptDF0m;#PWcK+Gl%R#L|FHjqGW*Kt9ali!IG;|caRZ-T-5#PpI4@u- z8$kKiy}7p0m?ToPr=-osJ=|QbT$(tM`l?&mX0>uPq$PU>G3z=2<;pwHiN$oRg-?Fk zZYdwW97ADDOu7OB;9_A+ybP|1?{5JwJpoK*0|4;(uQ!%f&HLe=LE1(YD=TYD@%LxT z?Ph)V+w}Mt;!nR0H~?wY)&UGn1JI|kfp=}#|K?lB1_9urTOcI>C}e||3)yWX041}o z&)BBuWS$MnGSP0<(Kf1k-Y&M~tZ%YfM(6DefEzpI>*i{=Q`wsUzUX|mER)uOX2*Qp zUjCPQt(YPdNBOb?GYo`*&=2zEcXOWsuzPrU9^M~^2uKJWO~SlC2CLQBwVV`7K@jD` z4-$|yL`I&0oXGAu&k#fz!ASgn(n7SPqZugcR2c{ZIlLej@=q=)A%Th?b1HGfe~{d% zKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000DhNklXr_0#p# zOB2Qzc>EIrC*U9)goAJp4#Gh=2nXRH9E5{#klqimm4p3$|0@6o00wQk{(AtMPdP!M zQ0N?p%jNn&DIF9=@yQpqEDNftzEM^6#5B#Fp3IPuk&%$k=Y!kre)5G4!$7H2!sX@V zcC}hPuq^9S&w+ToUif@I^!4@Gk|C5*Se7-Y>-tW;UQc$zVpU6>s@v_h1p@#CK|p_h zKfGQqhK7dbL{Ut2Lxzx6?#kKO8MCARco>W^D2j5LPN!3qO6A0|td4f7q{TFCXHLHk zg+e>JuJ=xrSzlk@bvm84OPHpKQmOPSW9((CzxDh5-#X+|p-|XqONK-u5!)Y`#$&@6 zgJoH;vtwn9!8A=6hOv8oex9;DLp&ajEhYCy1!D~LdL5NYMFwC$$bCiVsiC;4swftV zZ5ydVlBAvjp_D??G(Nd|INoWc-{Z4g4#Gh=2nTtNAZu%DSXfx-uJw>kg)GaMot*^$ z+}zyY=;-MAW=JBDXkfer@IIYRBM=BYPmo9?f=ng@0Iy@Q*mgV~-vqGx?%g|hJf7zT zGB!4bTrLLyyRleo=lc2@ilQJMkEbL_I?ZOYZJB6xB?zSyvMfWAq{DbTo~l->uq+Fv zX`)i806;Pr41Shn`FVh3vsr{fp;G`$<#HLOX*Rzz3gwvx4I;}j zqS0s>Kx%w^TzQDmSmV$%4dHP31VCzWaS@3`;^zc;P*Ik`;qZy3X?BLKp=p0I^C=&wOS3| zvmNo^7~3jO$3ZBi$mMd7B4 z@W(fP`VzpV-|tV}e^vl2MWfO3{QUf*+tboE#LCJF8yOj~4Z|=DOiWDZ`F#HO+}-c1 zt1Im7?UAmZ+!=;}!^1=8#l^*+jRkC{(+Nr`Ow)v-D2rhn{gb+|lK?r$Nn>q?2iXw)GhcPfP073{vQAFc$(RKZQ?=T^xi8(MZ z@NkC?jIriprI4ErD!pZS~aa5WwAgaa&tk z?HQ@w503|b;Q#sBU?K_N<9D8?3}C1oeaO=N$$Kfv_w8;=hVV|6gK!WY9E5{#5DvmY fI0y&nNc=qj(we)JSx?G-00000NkvXXu0mjfs)$nT literal 0 HcmV?d00001 diff --git a/data/icon/Controlbar/U01_controlbar_cion_up_folder_press.png b/data/icon/Controlbar/U01_controlbar_cion_up_folder_press.png new file mode 100644 index 0000000000000000000000000000000000000000..2e8442515b8643f79a7ac2f66fc4081becf7378e GIT binary patch literal 4007 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 N002ovPDHLkV1jH9cas1B literal 0 HcmV?d00001 diff --git a/data/icon/U01_1st_icon_dropbox.png b/data/icon/U01_1st_icon_dropbox.png new file mode 100644 index 0000000000000000000000000000000000000000..3677169ba2fca1cac1d8f080df1ce4d3d63a73e5 GIT binary patch literal 1771 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 KMNUMnLSTZ61_loR literal 0 HcmV?d00001 diff --git a/data/icon/U01_1st_icon_memory_card.png b/data/icon/U01_1st_icon_memory_card.png new file mode 100644 index 0000000000000000000000000000000000000000..277e97636829e9893ebd227fc4c5da25bedafcb4 GIT binary patch literal 1706 zcmeAS@N?(olHy`uVBq!ia0vp^ULefD1|(%J94Z7-k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvFVh01TzDhUQ07`V^>obV`EoGQ$s^nBS#Y_ zXA2`UM?*6+BTH8UbC_PwyyB9?yyR4vy_rCJp?Zz*>a}t%N=+=uFAB-e&w-_YfQv zXe&?th*+&)jLywWuM`K59k7B8@Hx zatsu44HOBTmr=UcL82|w-;(cK^W+C28K-ynt$rZ8gZ0>i({-nxtePaUdxBC~)9Qr4 zeP-%z4%4$`>#rND2Sy+0m0`X5DPY%(O&zQvv|Aus8Ws9L`-US=3g_cX&IyVLtDZJDVS{ z+;`8FyCgrCd3S7lf{M+%sC5Q`w;jq)Ri4(nka%L7?Y8KHj*la@?^|W~+~;?1a=WzA zC#xlTv9qL>oP2WqK*+0`P{tzKx0M5>Aw=e?>77SYR!_i+diexFY%Mu)`LyU zq&$!KsqcAK;-fdCbH%l$U&pq!T<#Rh)%0BSC_DXMJS#AspvVvwd%!q^L?BS&=mMbV zib-9QT9;?5u6kV+xG1IdeU7Kf$x{!1Dn(!6-tcCpN@UkxqaWojOYIgd(wL-Q$9Atu z?-j4a(Z9R?E|7c^GoiNpee)wT*4(x`*E8pDTlkfwzD(fD}AFMj3Qn_4@h zO7`cxn|L%v*0FgS$F<$EA7p)+_*X=mZsz`+Khfgh5~$PIz)lURd^DYbnW4GjguYYe RVOLP?;pyt@y)g69AL literal 0 HcmV?d00001 diff --git a/data/icon/U01_1st_icon_memory_card_press.png b/data/icon/U01_1st_icon_memory_card_press.png new file mode 100644 index 0000000000000000000000000000000000000000..00a06441c01b31868387481f66615b4462c93186 GIT binary patch literal 3503 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 literal 0 HcmV?d00001 diff --git a/data/icon/U01_1st_icon_phone.png b/data/icon/U01_1st_icon_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..647b42bc01407e651d874aa1793b67432ac4077e GIT binary patch literal 1514 zcmeAS@N?(olHy`uVBq!ia0vp^ULefD1|(%J94Z7-k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD#PU%0_}#n6BP2AO_EVu8M)o`HUDF34YC)x{-2sR(CaRb3oXS&*t9 zlvFVh01TzDhUQ070b0;?^17lZ5Q$s^nBTF+E z6BkQ!V-r^kGfPKf3z%NdyyB9?yyR4vy_rCJA$lF%@ana4E=o--$uA1Y&(DFSfPjqr zlKkR~`~n5%U{gIqh49S0l>G8yQ1n22>ylcOS(cjOR+OKs01jWPOf2@Bm=N+eL~jZ? zVWtmsj6NuFASD)<5HJOTnDC?zEyD}DTbK*%#O)z{|0?OIH zQiC5{cvibCFfd;8>XG)d&D@guKg>Uf6wEty$DXfhvfV_T?p>_a3nUesX8smGU?*{Q zv4*Wp_5-U!8^0&8PWf!{`XzsX(W8y7&U)?h_|1A6tS?-DHbdTkMeJb6yy}qsl73Hh z=J1Hmi46&y|A6U=Y<?QW54Ty2(pK)NZMNbMWTsN_jsqD%T}DbDE|11 z=|VME*5@)gjcnB+>7Geinwo)CJKlOseiC(M>B=Q->ISUslgw1ZCY|nDHS?Hm*rZ;K z|M8FSO|`lc(;>xRUO6%4^5POzTdk$9)~>&xu_{;L#i`SgKlaMGo)rGdJulX7VbEj{1w7$&Z_`>6Iu7NzRfg&K}8fCt8qT_7#-+#8t^VvdU hDG3@~UNQezBp902&uS>U&Xfg}zMigrF6*2Ung9)x84>^h literal 0 HcmV?d00001 diff --git a/data/icon/U01_1st_icon_phone_press.png b/data/icon/U01_1st_icon_phone_press.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe69cbcaba9508e44bac1cc9637d66b711a82a3 GIT binary patch literal 3273 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 BG!y^; literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_control_play.png b/data/icon/myfile_icon_control_play.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d79282b84238be079dfeb0a3333e5a6e255b36 GIT binary patch literal 3032 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_entry_folder_press.png b/data/icon/myfile_icon_entry_folder_press.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e50d3bad15ad860531a988dc834affe0444298 GIT binary patch literal 3078 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 U#7>b3i2wiq07*qoM6N<$f^NE`p#T5? literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_etc.png b/data/icon/myfile_icon_etc.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc767d4da2411348b979e0cecd7a0493ac37872 GIT binary patch literal 5229 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 N002ovPDHLkV1gka2wVUF literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_folder_open.png b/data/icon/myfile_icon_folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..85e0f1995c990a391a3284863b3e6c079aa3440c GIT binary patch literal 4233 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

voFo#U$8L%?oBpz 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

    +l#=P`>76x!?m=c}XL;g@ zqpYs3^5vIb^-;0Z&ZCUSP^i#4K__YW+H4vYRt^9C!x~O&_7A}yj6i_n+AYmW#WLi> zzA?e!Da*kL&16=S&m@Gt^8m=-jfF>Cc06~%Z-6I*XEIvFvN57HoW-S*iRUwlciROI-H6ULfK_`|~uZdb3fQm$jIMw$dE zJ%sWQBCYUB0UFEIMMJZuQ5fRHP^uz;)LH zTq_H72$zPtM-EKUh%Nv5)pd&17_7lc2~vTOsZF;CVxev*S1hBEz*AtH$MFNx9N06S zZl^ofwffyIm%Enz9%3@I9v6#nk|@gX)X^EjjN7~|0XNwT@j9pU?=!4Eq32L!<3oM^3Nmkl^@!XYeVvl)&Znqjh#<>GviA8(Yo zU25PED3$)!xwMQhHWKmp%n_7ae46U@sR3*b#=yKlpGEIVQCvr@od99M z4?Jcc8)JMd$Dw@_l&Vd>ys*gSt3?3z&5d&G@HAt?A*1;WQ5Ybk0NY;qKEmIF1`N~- z+?@;hgMff2$`FMaW+q|RWS&|h%_Os-&rmLdlHv~8Z6f@g|GGzQ0(UcojUeD!31Mq< zbR-`#G90cG#)0i}b$1coxqH)rhfIQ-gV0J7dfnLF1nTi?+Y|l~d4Uv!-fFqKBW_zT z(SG*s`-2+!=D3wZ```y1Y zMq_PCdOArkMx&I%S=*`SD^FpprC2OsjGGwJOzWm141owYGB@s#2-k_j#oq0ifSYjWI|m*|TR4 zb8~a}zE7jk;Of<@%+Jr?QwX|#qWOFttu;$aOB9PmmX?-~Qc@@sXf~T{r`-!+4|GCA zDTVL*J=g8FY&J_ipT`)(!omV;YindO8HR?2wtZN0pd{G7*IsRF?E{@Dlv0w<=NTRz zrc$Y3tz~$4m_nhj>2KO3{LoCGy%}k(?YY-|=70U!|9;P}pJW`zOiWBLF)=}@R6bIxox611&>Ov_xvPeuD%b8q+U enZVDX{m%dcu_<>OB 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_mmc.png b/data/icon/myfile_icon_mmc.png new file mode 100644 index 0000000000000000000000000000000000000000..f486674e69ff3dccf9a92fd206e19f7b19232347 GIT binary patch literal 3006 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_shortcut_default_corner.png b/data/icon/myfile_icon_shortcut_default_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1a8e32db2483ea130ec5982ec42f8130b3588a GIT binary patch literal 7177 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_shortcut_document.png b/data/icon/myfile_icon_shortcut_document.png new file mode 100644 index 0000000000000000000000000000000000000000..fe02aa0d2fa0003279a75612ae6de70c3693d633 GIT binary patch literal 2506 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 AVE_OC literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_shortcut_image.png b/data/icon/myfile_icon_shortcut_image.png new file mode 100644 index 0000000000000000000000000000000000000000..f8274152e93c6bf72bc603357aa1dff8615fa47d GIT binary patch literal 2940 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_shortcut_others_press.png b/data/icon/myfile_icon_shortcut_others_press.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c7c195fdf3f309cd0589897fa98a989e99883e GIT binary patch literal 2959 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%0DO-+x(KnTiM=5(I%jBIagBww&2) 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 aJE+T};PNeIpT*9L&D_|^sK&q}_J07Hs9G2R literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_svg.png b/data/icon/myfile_icon_svg.png new file mode 100644 index 0000000000000000000000000000000000000000..64a841c9557aa7733750b97869af40dd53482784 GIT binary patch literal 5890 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 Y0A(;|9eB#14FCWD07*qoM6N<$g7r#G5dZ)H literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_swf.png b/data/icon/myfile_icon_swf.png new file mode 100644 index 0000000000000000000000000000000000000000..ee50e850dace5ea0321be9644dabd9f6b72edc45 GIT binary patch literal 5653 zcmV+w7V7DVP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000X>NklP!TvqkjAj#CV*ihssh+Z5jTMm(>6s?++FUHd(A!bQp~Zl2M_U- zVhuUi<<9W&|GxkJ-;f9)@IyY>VHXJ@(=JId-ueJS^xm)EM0^U0!fm<7#q@z5F$C_BM1U)Y;3H( z_~MIq?%cWa^A}!t;g`2=-TEhh;HbZ|xVVV5wKaVH`R7N}!kOWzl!8wPfX=u0G zXf~TD7K_jLP$cw+}zyH-+AYqzrFR=TZPk*aA__ul4~crLrjM2x``Z&F{r8vP17(lGxN$D zZ@lrB8#iubPfEgLLBL@o#2LY|ED#c6lw}#3rXicnqEe~6a`WcR_pe{Sej*asWxK#A z3F*J<`+h=z<2aBc36dlYxq|Dun4h2j#hY)wxl0K7{f8fZ*a0A(I13oH1jblm5wa{N z6=bXsN@?N>*=!coYV}vIzWVBKUVH7e{MObMIWr5mXaZsqgb<*VLXsqK&hf<;U%+); z_`Z*PJ`Yt@k;!CGE|*a%mEgKAu3WkDyO&;i$rD2S>En+-ZXd@I9xE3Z%?|O&IfrSQ zFijJdWuacLCw+tCIM6f=SFc`0wOS>d^E-`3<6nkh{NvM4KkXew!lk)@VHoK54fOhb z7=|&C=(ulC6a~7jL)UfWayb+V1r!Pelu9L(%VkhX@zqyf;iHc}La*18UVr`dyQNZT zWp#CxJr*ty1Od9e9@^~=+T9L3*Mls}v8n+f;J7XrrO4-UC=~L@>Ut9FbX|um%g}Wl zp64ZJ++7AikaUncJ3HufI&(K~-u$CwS-)OiU;pN?2I^c15JF(L*~Ct*9%)j=RB0NN zvBbP%0t5sC--m5k*s0ZF*%oG|r%@~vz&TI)|9BSQd0rA2<96D0U1TyD*tU&culF;~ z`7D5MFNJ_kw~Gf`TVRwSUnoLW6i^yQc8O9@Ndh5Kn7IWYM5swc%|Q3_aBK^`UJuRI z9u^noQ7jY^z_G?-@agmzm)Ev!^B@SwQEq-N1k@W1Y(LyVK3{;E(ZIM2E_3iGwZ#R^ zK~|IGe>DT6-$T8z3&(LVQ>lP42H*F`W(lM7g_P{%!UzyTU~_vLeZxetGzCS?Kv7i4 zvK#?N1fF0L2SNaZh)9bJjCqhK1?Mt4-8M|q!j3RMlk zr&AgM84`)4@)RKe1c4yYga{NFN&7%m~J zp;(%N92F^?%ODbglmbo&!uKiN5QHqau8VrJh1OmhhG|0P96$ZZa}kL^u{4dnRs+pe z3)AKDL>IUe0$kU{#^xrn**p|AgN&+za~YD9(tHej0s#QfXtwa(gDv>JpDu?W5dt9r zoXZdb(6jk4zT|RA%X}KyPfdUj0uOg;;9Q218TdRI0zXPX3@?1QwNu0Qo7)r0K_mf_ zNPsMJWON<6nZxGxHda?wlHOsGI~<3AQ&)nH>!P){2Q{NXR+Pl&r3v5(0VI&rb)df6 zoD4oPka&%FJ(`?6z8{W-?=KbZiBO$$lm-AcR1>-3C|G zaE!&+Al1cyN5GSm?{92AgdYqGxwg83O1T6f00Dv6q6HDr8Ul`B}_NmmoS#x`v(<*{dBe4Y@4@YRW2uZF ztPFwS(FP%*mObB_C?BQtSV8bqE)WDFiS(o8?SYdX0Nb_3$)-e;%u1ZDh&vSl@$62B zVeK3?gX$X=+TGsC<_jY~h#)w$vpn}okn=Fo3K5=@q>a;8{L$7PSh(R z^Byb{1p+bZg5hvPRn*HPKv9%%B;^P2qx-^^b^;dyFf9wU#&GbPpP5EBs}0>JqICo& zx6A$fznH1U%1$@5Mt35q-yB@x({q+l{TE)F%;wh1tqL!D8@= zG#T+q(M2Hye9wdJ*vRVIfo^cFSs<>yG);r;*dYnN4??1-Ee7%53w*49{{VaK&d?f* zb2H$a4X3*y3mBOHpfU_6MuuS^qpD!heDP7s_%m?@3f}XSp8t_^_?qAo5N122;Ggb;8X2iibZrf zU35F`Xj4;yEGq+>j_#YDDq(qP0i3ZA92qYjL^_D32oOOCzS(R*hydlOQZfp^R0870 zV_|*{-+cESI{W*HV7Xitg+dOTG30XDq+Oo4-`So=mFnAcmeDbes@;dw&m03-ic~ z3_&g}28^aeUDvU^v;^0&(Q59Z-|xdTEqI=fAc*$yM1UX=W4;|uaYb}JyvOr=n5Kn# zt%h!AA4?1KVbDEdbLGM2$@ zn1+E)dmp~ zO(PV7Q83D&s0wDM%TQG%$u8+#-$!nrk0JZHJ|B>_1|h;}uBK_pnqs6*i0@5z*@Qww-%0Z%R9sRcYG z;FJW2{{sRJ1#sxU#Sua{A!H4})Dy}KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000EyNklzI9LK+J=FLnpqb6yHjcBlhs(26~c=IUI!-9Vf>K+zy$idQ6 zX+5k^upZj8^spDrp==Mm`3ElrQR=Cn6vW#?Q;-T`>WUJ~B$Jufi!;P@Okzy3nawV#gJuN~A0mpHmls=dl#+cR3W*7#}&dvtM$H!Mz zR#sk)jg5VoNF@FMU{rceZ*MOK2M2L*a8NNOu9*T9i@@_dD5ap3LJ)-ibxD#SNfM5a zkHx;ezLA-kncsGIcW0}J`AMzP%}664NeBVY^N)%kiXsF-fGo?nxw*mB)fN1He@849 z`*nYR|8+e@sCXm8Fd70lI}uDF%&W)afubl#rBbFKbYNiMhr`3eH?dfZHbsC&E|bL~ zl*@*6It`BFAW0HrSw+5R} zLO=+yLJNx_lUu|q`+yG#XvOvjNYikEH8#GO`;-HkmIzzUkCp{J+k)xyHUzl4zQH#awLpCUp_SisH> zlv2wUq9|HBNOMAXp0}*f(b0iOB=Yst)YP}r)6-q&=jWuM7HEbDj4|*$502v?2m+3d zj-Y88bX`YRR~I}U54>J4g25mHfdDj3Lw|q&cM}s61;*G4aej0A5~TTCY4J4Rjz=lNr2~UgsN?ZVOT4H zS^Jyae2+2qK#*uO3a{6TTrP)9Ci8_L2%iG@yY2!sVjp0~o>KmpD}g!V=2=4V8G^aJ z&gF7~VHl*6&0E$2CICy{17OX5sZgcY``C$N8Bm-7rXY4TLxtFhqapZM1^Jjz#aU2I z>@5qyYR?ySUAN8{hlYllBS14CSZ#`%U^M$vv$v%!P;K#4Y>Co?)sI>LyE3}eBF`2; z*LAddD=nkVET|@S$3oDqjf{*mhXJhu!Ft%&@eC+;me7_06t4=^#9r|{zzGn1OoX_PGo>9fGa>98DK|Jr$De_tAGnZmjSK-?OhDHJ3$wME(2TvTnM%c1nqty z;uHv0^XnFu0j>abNFyg(pyeP~PrkSibRp<6z|8(jPRD<`7v3HCytyTee00IEd{grpfz;yr`02P477}IOr2pRV`((mm;oRaKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000!JNkl{R0t^o?tFq z@(a$R1Dw10fJEL;(Jd9XsA_+V1z5UyuOYccF81 z-^k~^kpKkH7k)hU*kfBSQXLJr+qZAu`LB_~x1d$Okw0@5ux<@#_7--5?1hOR->?-# z5a|x{$S4Sm!AkNxHm@zN1uPb=6tT64u^0qLk{2fH_DDAu9$YkGEVsY1 z>n&+ra1?meb-rc-O<*4A0;!AV!rSglDC_-JqDZ9_Z4_9YaA#s}bR%-saMnOsS&B+= zIEZO0#S&%7IS$7H%hHs_1YIHoFAVvS@v$PW2_Uw~U3%}d7EFwNdFNZw`g03lVMD<5 zh|-#(ZSvP6Cpa+Uu)pbZK63eiJ4(Y9QX-U68WqLZIHc@)G)0p$0jFZapd&<4#Chwm z)D;42*(!#DR#aod3tda7bx+s=qQJ(<{q4j7uh)Pted$Z5UO)HLQ%_w04WKM&2V56_ z@*LkeImNa$@Toq<;U6Dl?A8zQEmm{dSZt_hT7|}?pcH|DWB7z3oI~*2bv$c0*)hze zb9AE^Z3P=CVy!RId<(`Tf>(NBv|gzOTy_Da6M~c=N>P69NuId&Ccf!x;J!moGQ4^t zBZFB?!)3<0y&V%!iUt>K8gLX%?Xv0FACc`V(x^8%ciY|A*d!cFm@pli#E)BfO%pEi zYj4HumHL3oTEGQOuoh-kUd!-5Jcug&4&T52BP^Rd&iJ#FtjGt9xq{Pb(lmga{kOi{k?>j3=IW;*!{U z=bd-%?74kV8u47LNj&n@t#_f?Ew=7?p0WEr&Z9bo?`SsIh*{-wIEct#`Rw7B7*&=( zd;f=Mc00HNzcP88!(%I{*8BPG7oS0&Jw|0@3HyAXm905GSv^N{aEMzxhxxOoc)U2o zUga;0)~hgqOJeJ*bB@D6tIDcfyJ)OlN4u|#->FgR%i(X@%v~?<=An;#hK|xa@OOW~ z@s+Fjc_49|{{u_?3+sL8O}6NMn3qxZ<4EU}oQb9H0^m zpn(!XpMso#D}pP@+2FB{e;U89OkdE!O{e+6um3K=;0V&Jb8y{_APG!%jb(CdIeTut zjpnIi-1YePxlL*2N&`H+{o@SG&-2~E46bJxKsav=rYD4V4hM+B5g1UK0*0(|NDDX! zt|&By+0hlG1hU2=)-bVT98U?_MC`cjmq|-V+6IKyW7jQr5JnNQWEBto(l&G)(e%@V zVT7?Uz7fhqq=5iUO$20-eZbRCKYdAT-L`Gp&L02d(Ug@UgF#!1CmKh?{IUHUpzhIc_l)0XEY)N<& zJQOI4Sc@n_U?F1`M(Y&|;EP}U;;A<{AH14o^;F^r-Q-kDN@-jxc%pEX#Sy{t6!k~H z3r7!fCi2+0YJ?Bm_X(WX64oafTd|bN(MhB^&ytl(m^!|P^4O0Vx^|dpcZkTu1lA&= z5NnCW5Fj|#QoP6nE=TLt9ERR>E(LfZxRR*4Ckf*z5u9EqL@9I_F&IyfFZ-OI?eM-^ z?_&6xE!bv5K31(C5t2rVlMX7=YQ zjoBW;y4>Y!g)50~azt=Zi6-_aQp5CYLXA^5g{He&|7_4)4a;F8f|N!p_}uM2##rZQYJn=qKNqWXs8K zu)<7Y#YOj+_Ig5AB=1ZsSzH{jYuBzzV(XSITXxdhX$KH2j;JKtB^F2ZOv6hN9odVr zEpE8|7N$;4QOu6giX5WCFpi%k=rrgX9Y^XA*4pfQ?8lf=4#z-WHbb9d@r=S+Areby zZK7FPFh&y_Lw5nRE(#9tdv@-M!c|EqOo>fQp$CzTU!s5g`x#D0y!6b=434kiwhw-S z_acZ12wOEauHVQ_@3|G3o8qfq{R(w8&-FKs;jX#`yaKvw360<=i)$d!v6vVkxJn$L zehwT^?cJNN{#gW#N=yK7#Nvv=Qwk-DjOR19d5uBd= zJH0c2R!Po2?>NX$zR&1jor&5c`;X7Ca%De(YSNtCPkwL=aU8e~k&zK!OdD8i_0}4*0?szHmuwef;sqUoEy> zAjFXb0SZDcogsYcTkQY8f5P1ODsH&z-*M9i$C-Wh|8eYOKsBt8uAOA&;92S?j?x*c zGH^|aiTX4HV7WoC1cfY!)+@#V zms>zf&(_5z#UT;0evb0trHye_7L}e<~JBD2h8l-$z1jnOYeFg z%E{50Im*%JA7`c-puIdT8&io4Uap^ZZH9ss<|_>1VkK$%uq;wtU?Gbt zMbG{PKjq`Typy@V|6|4q0pp`LGdeKL4|cu61K;=uKKcj$je%{q<5UhYU=4nBj>`U> zbn9*E(`SgfH8yR(gK+DosQW1z{%SVel;`-9f6H<&;Pm-fmTcb4>YPuht~uN8fVH^D z;wD61c;SUhV(X?&n|1;yD;TA*Vp-LiqV><;V)b@YEzub7ljmpqn=&U}IY_H8 zMD+t7VCwM8eEq9`&Zqv<@6tN4oBmW423CMEn7K;NhCBp?);=zp6p$~LSza!3UAT{# zR*FNFaSqiR9PJo37S^$0;(46%D4YEj)w$jLum1PGb9I4xqvLGIKsPr^^L&;0snfKU zuH&9%W#0Fve?)O)4N99rb08^HY83Gch)$!tKCB3a5}9n4k z#`=$amasF=&Z!!e^#coL_HEAxJR4;=bAFnUqNcB$Ch#4KeHnE5 zR2nfB2?H<@I1V%AXrik=jX}~GL@8{ygJ7{3Om6U1 zp;!Y^t3n)yn4n4QxfIhG>g5&Gy*$R41<|@FIKbE#sWSwDkENUb~Kni&ZWL2%;EK8bPpDk}7g`h*+hQNPtD+9+LAsj53(~ z2-eFIg#ocK#BoT}uAvc79)8~lrqg2HYNFRQNnJ@k;4OW?<>q2*X;_c>#yr_##Z>%7h5^=MDtsX$-%1N(ZDn(pa23`(qj8YmAMYr7~>U1%23b!~6#u7Gb z%&Q?{3n6Afv|h0fc;t~s-t^C*wFC&Ab`4`f{K4h4Yts}>gcTtOBf=;oB`Jg?v6*Ou zf#M3bH;X7u*lj`_ zVd8);mYQX8alrol`!9*D>(;H?nZz7R7n@`mX~8r2DDw*!nZkY!t(5+1q$6XvhOVq6swC1o;7ZruH zjZigEUI49&f&*qvOc+Nv#t^ovMC}^I(QziG57TW{=!l`N9m=f^)wvqgN|iW{QCc%R zJc#FcC~uS~iiqduIeU77C=AKxb3{=@TPtMh5X*)NC_hcuohRxx5)2UrGz?U&q4ZAm z2TaE?Q`)CtUHZEXg2pUx{uiFWA5AuW}S#mt3{=99@q2mvMB_?n3#4uL2x31v58-BTur_&kC`)6 z!=>>|e2LJ#7 M07*qoM6N<$f;}Ni9{>OV literal 0 HcmV?d00001 diff --git a/data/icon/myfile_icon_video_play.png b/data/icon/myfile_icon_video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..bbde43350ddbbc2a35be7beb69e35d594a4f081f GIT binary patch literal 5001 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_excel.png b/data/icon/myfile_thumbnail_icon_excel.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ff6e624d74f0684a1dad36564dd1b407b5dbe3 GIT binary patch literal 9778 zcmaKRWl&sA(C$L8;Lf5!g1fs1cXxLP?y_ib3+@oyA-KB*-2efC%OZir-MPG9eO0&a zpIi0J=|A0P=JZTY_vt5ERapiNnFtvG0HDdqeo=py`Tq?hg!kuAc$5FT_~;_5=MDg% z;QTjW0NJ@f003FVPEt};)z;a=+1=LJgjqHq~cZ2(J33Xb^KkEjm`3BhrAYD}mx$bS)c zDT)%pilbsCp0@pq9TvOq_NQN4mP8I}uJW3|i2X>Y>9U+^+`*`o5@c9gVPnIi+q*1c zA;_Oy0GLQkmK5$UR4{=1Kp`PU%6`ON0F2K(3KF1SDW{)}B=Qa8NFvJ+Ciojnzef_E z0#Yz8K+G>eq6{D=4HKM~NuvSy0S7Rhv@nMNRG9&$v_bpxfZ)9QEPoh)K`I3v%#S1h zIgVA-7l5rGpa!fRBL&c91K?UK4D$p2G6UG;bgX3oKidHPGngoi03=iZn_5&jJpj%h zVET)S$_MZ*3xF$qsUvj3SciGQ@b0OsMxl<+{8AwXNX)K?Iyx+5bTe`UjJP~zux8m} zEQ7vTgd8DU7+Y6U0KktVy!WrYdhwY-ubY|SNoYkkVLs|Zc%w8ohrI5At6jtZfNhV! z*;gjkCZb?LgkZkUGm&r{PvODuYFmtzL=nj`w*G%WM9$%_Y%HTg5)FJzA5$zQ8z^f~ zt4E1`YS(<|ioUS`H+aKghe-8*%OjL{5i8!p7{!x;{yq~e7B{^t2zQf8jlxWUj&q>cYsZ$*? zRpxNX5>cg$uUI-XBJ!s)ku&}Z-_6?{+U49O-le!SK+ZE4b1k{o*r8LOu$L#?!`$QA zL$J!^5Z5ZsR$s3u)WqUW)R(9&Y*nvUi>$!m^33L+4#SsID6K6@nvZ-*^6fFtVdx=KS8&Vunkt|XB(O?4U9wkSyAZ+qsqHsW~j_?fO z9;RuSUJmeL=*oN{?TQtysx0J}|nPtbf`+tNY|~FtyZg+f%fp!os{R5^+LN6u zenwbDodF7saJxDSk+P1hUZ_bL4T(vXnx&a#Y=2AYm=!8skdBweh_f3tgnWiLjyjGO z(;(1L&?qP!DV=7kD|M97mkBBgDvnK0O&3isW^v~TvoCQRig(3wN|vY zTgf%<>X+%Awst#(>+|cC>T2m5HA&az)lx5Z)pnI*m3JtoC|Bn%+6?`?XdQ2@Y$N=+ z_ZMNcuGO&>WM*SdVAD2IH*}iPlLG1l#lHw6qD3yFSCi_K2D&%9;Rmo{EA- zuG0@$ZFIqy;J=)ZR-8%tVY@tyoOu}=0-Fx^u&b!pXob*8mJAV=9OBXSUp>3>9yhK= z+kSI5c{xovgC`ZM^`|_icBheR1yfuF^!a+6?!SkANp7j_&5EKFq_H_{)�Zs)X3I z98j@ZuqNr$F8ypP^{%=zJ0lRe6>%$oh(LsRH#j!*Os07I+kUl8sth^jn}lyl22s6P zzWKe)0?LD_VQfA`hlqz5z&_pk1yJ-QhzhJ)-8L?th{yft5XTcw46O~_8>pqQ{dN4k zmg4Rpb0%rV4n15o@ZaKZM6-Rf*r7mF+VIG5oe0qcmndDLS@sNW@7Xm;_suVlU(&y9 zrE}_=IP3PRUqMKVW{JA`r5nsd~y}JledEc z@h8Y+{bl6hTR1a#9bS%K$%4%!kS?YerOcOlE{@4ifgeYGiQ`S3fb2U+I%q@5I?FQ~ z^;go6flT>QmO;rc`8cVY+xPPbXDQQO$2Z!_@7;=Mit9N7`S{shoFs@N|gQ6)TdiwKy0+J(y{KF zj-KF8ug+(jKACEoSpCkMdsgsvf<1`6o!nX)p`gP|s=MD)W6$3xx*9cY1ZfTCz2?}dY)YfC3aD!QzCn=NLK5qZQS zc+oL+xT^#ictL;Z)_nGeBb_Juver_YE31b)EWy@u)`$BW%=rfB=~Wr~8R$-E%PY-j zo7&AMH@8x&tQpgEt6gEOk{!i;LhapF<>NEcf})xwn%A0-nmng->n&zW_fE5?#Qxp4 zT*nKm2HkfrBICWQS}KbiWQ59~kA3QW%{%jEM&m)#iq9S0p>p}+yL))|ar2H0O<=_<&c9|GasHDR zsSPQsy+rn9wsek0_LG6RL8r=;$n4_LhTpTy>L-j`E+IW%`76zFyOqPx`4pQ=a9mzm z9w?CIVa;^4sMY_#VrJ7G!}+We(_?#1>Miy_uv>7(@Uq?GvT=0}N2gsUyI#P=@yO#y z=rv_tWvnZ=E4!}4(4phhucyV|`tFc8pLb^cy2tkd|7~$0pI>;r=gQCdZshJ}6MsF> zjrL_`vTNC!_O!NJrQ76M>_mK7ay@cE)ZlgP@7Y?AeZTjQtJyV~JB08s@N3ddB8DV< zVpig01X=_%pHGCJe@E2qk$tQR%dY!Bzz-JA-Uw|&n%x2COW?W{Z^f?BU zz8v*K3F}u!2S>?z$9*{2jjy$zP6oW!yh+cBH!)Op1IUBu-fSNlZZv+EKcx_+q`bj> z$h>;C;ACEXuQ$mpWYv`b06%H~AUF&FczAo4hX8;l8vt-*3IGUX0ssWg$tEMx006O( z+!t|8pOxc0hd9Hrw9O!`yM=mRjh*kf^cR)oJ-Cjwmh_j&%{*)IUzd}BlMyF1SpB~q zLx9FWSZrG9OX?@H5K{u^@e2Dfp9|&(tQ{Y`kzbO!6UOrCOU>QM)KVq3G1&YiU)(lc zy6?2LMArQMJN^CgKSwGxqPxy=&VzE=ps$ZXN4Wx8)N$;(O|6SGjySqaTYCS&dfoEe zj6P>^+Stv(`?JBwj zsyu!3B3Du!#$4l|osM9uvDspo<-VXdljG&41Lxkmp0k%| z_EAz2k^soVL4h+8MIG_IpYp{HAAa2`aR&7_G5P34BKp0?wKR5wF;{%e-&t9N`TnQ; z&YQiUr@r%W*6y=+ySJ-P&s&Hpa`cI0A_46I4d;$4%^!n}y1cmGy#D>BK-q9JGGx6G zBnWk;29+IiCqUSEct)3-YzRq7Nqx=-5a0H0Pgc*KM|pcMY+hbo`W`P5gA9AgQo&^! z+5nT=Owt6%l)vFW7bAit&kG@pQe4)aYixCSA+Uvq$MvVcJw}sbeIXwcIrA~Mq1e>X{{mzRs{ z8eF|_l$h_kpLHdH1gd2y@NB6L#<1<&NHeZp>|90^a@$2hL??Oo2ecD6c4VN(|L*nh zeTN?l3k#ivA9hogm;&&-6#$#^PyP=9WTm*YD*0b;pW@it>tfHI22R(z-flAbp7)em z^iMWLUasfM>!j|#esWGb_q@HsKe}sq?P+4wWy#3O%(NYZ@}cJ+Z2OWKv^l-3E%m+L zh`t@$h;~syuZ$F4M5=wNUq)H54q4LeU5yAR;5rNwnry%vLPBdKA-}ff^*IFu9=BOR zhYI}kd!ImeU7H}Z-x5f!%oQdo3>yn@o9Yv7y3LHGmTqp155~(D_%DyW;7(5{+2iwp z=v#)#%aKkHW0%QN=%pOW`d(PQK~?DuKlmzptEDlu(i~y)*RNk65=CF{+X{SkqVGN^ zPvrmHG8)@rM%Z+_4B+JCyz2juy=8TdhK_#9?{mK8-Fw?ozn-$uR!t;A;E=(zW$T$W z869J^skx%=r-*dgSVf*#0Rn+AJoW02bfM$bbI%zu z>^KSsY>wT5CiXZE*_MT<9X&h5G1=JITn;P}g>P$B0(Nk`6XW9eK8NEChI&W$cV%xw zJ$lyF8JEElNP}!}$=#;qEoHhKsv2!iHlN<^$Id$U(hb(CvECi(0B6E`Gif>zJSkr# zuvw4OOO6C2BI-PwmHG7I?SFUL^U}KNbXCW5&*b9(*i;{ZC;VFL85rBKhT6Nmz1@R| zLH5k+y$QOTLG5j5XsCu2$q_S#m=@!GS@O(@{x`M5Cyf+x;A^D8ls8fVU8;ZkSDYyF zn83cjNopE%Rk61t?nAf!Sqpw1+Yi3taj!|VK7 z{(c1c+TRys)VASQjTj{viGI_3sW)OkwFmX+TRzXi49zeJ%(56uP^;CBE~?eaS913R%+U7bRYlia6jm)&}6_F1)9b2`yKyn`1iX|@_4lktb48v*le+^ zJ@-UFlR#=-Or5kkx)Cq~7PZjCP?nXIW&8H>CFEEP?dw8UhBXJ5U?2ffXvM$O0CXDL%s9pjd||{P~;89>eg71p*=>Aqh!IUtd9V^v8VAtseR( zkvPmy^9H`opto0A!zI#(zhfd^Py5q3{u~SD^Yl7^UMIWssS_6My~e-p^Yim0{BCf; zq=H@n=OKt>_m1GJh`aY2vv^PB4mDtL!5HRT2s{LoEL80W&MQ)upEeTmSzh_3sUuNj zCyK2?i|8cirE0Yy_ZN_Nw@*fr`TaBLIUhtxWGv-5U2QvCE0m0+(O;|6>V~3qkEA+N zz#rFa8+_$4(7tdx`cv7f5_p;NHU*Rn3VKsI>^UXOSZ#{&t{tQ;{hTogv-K3XnhdO+ zv~I35{$1s>u1>$KMu(eyl#y=m^1_Dt_O62`cXaPj4@bDTQ0J=2SUP<7QdiL79-r={ zU}Y)lO;ge|`tKII%}Ry(dwq4qZAQxbjgMT6IJdv}e`gb@ihiw0L$Jr$5>8I)^Ffi?{B3oX*|4)(x9P zZSWQQm~2Kuor0|hVNo`Sx>ho*gCyA-CCqc4FW&k4Bc)!20YuR59ZtMD3Y1Im}d z3;9OFN?D{IAP9!Vr!nDM4j6Eb#6D~~zv`4=23W3s;wlv6y(`x%vSsNo4!*?*BqWavk&ROh&}Of`9Z;sghkv-&L@k!HQ4^Y!*;22eCn7uZS0iz z;Ui30(QF8qhtN3NkHq`0-RCw&k1sl~CT%=T10zIq8(e4S&?`|3_f2K5yEFK$sXxFL zX*_z;R4g&=kI53WVq8}blu9SwpYOu~7W)YN2GW8W!vbrb3VpMNL?Z^3m&+a#M4@++ z?vYW7Q;0ky08^e^vreIKMk7t40fb)gW0I0B9!_`!lgk-M{#fBh5Buv*R#n_(Yqw@(+Vg9ijvk=CA_u+zqV%k4OZvCVkpY`0ABR+BU-w7u zOQ&eZkuCtAU?74cHh^QPB#kD6(eM^ZAR9oqHEFu+ull-?uELI^LNz=wYLgKPX4tUu zYB{K~sA2p%T>hP50~a<#P2j|ekYsx&mVX>MYybKly89dm+a@-{xW&&eghifC<(Tn1 z235l&QfK|Z!1js&Wy1=c#a=Dk@ulqpn?_Cv7SH**$6LVf@OpTI53Ok9Cj z6ri-<7Dk$~6b$+FObL4ZRivziwOzwr5<8I5vGmnrDAYUa$!F9y;t~pzS*2X0`3>9s z5Th2iBV?`nD)6r7E%WVmus|Kf0mvM!#9>mXUa&0#exVgzN}6OQmCOa zJcJ0aBtW+LMM4O+kPEtXwuFnjat{7flDl5$8BLoM&)O;<>9GX7?{k(Bv)BeB&5=%h zVKe0%r2-hMI#a#wPbth}$60IQ#Z>GYVMrJzHU;^?fzQ(#vCz|zNyFVtVr$;jTowUe z;HzheEG~B(^bch`&p4X%FhvOTO0W%7ank*%?;3ZZB7zk}GB)HbEJWMy4RQ<2?=~Pm z*hg9mb{sM|%moRsvxh7Stisre-{Y@3OuttiMzvT7S!GPA+QR}8|G4(Nv}eC8yHleF7@eHNr5 zPoUyKb=s9|Bkgxk<57~WpkxbG4gc3J-r=NbcO+HHFX@QNpiRse+(|wi>Egtw)GKnb| zV@}|i00C~^WoV724J=h}-K@#O5(sMNbVtfd(|E+mQ(S+*Xs~sXYz(@iP2T3k zKE{D_A(aP#!Hev5kd}o8%Lj1_t~;l`K1L6~!q3n-`#R*w=57UtL4q)<&%RmE6`tkX zIIHzF++O43gPY@Ybpng%>UcE)>B>wtbo$*Gg?w+xZR^wJmI6ORXX3yc!;Gv$`VD@6 zghM{LpOo0VtE!%`yjz7`WY%Nnq$s`K9cs!j3NoCH;J;<(rFc77KLIJLnC9o;853(TnJE-62RN9(=w>aP#vTeCnYg z(ra50JAPz=;9}G#UY5t+rkgBFr0Hfb*Q5vMkaF<_X~6^4VCTmTd4@7(ABTVTY1+1$ zJ8qtF>@fqqg;oW9b{@nDkXBrKBFs=-yM(uWpc*drA%fu2=ESQJ284x5xJWbZ!0(U* zL#l*|$Tf`3>9;DHgcj}M_<1&C9!mkeGK2kG#f@8e`B#?)hI8z+6zLLP6a;yNFanOr zSm#gHt?ZMdvj#rUYiD&OY@}p<)OpVNT)qdIH`}-JzlJLf#||q^7sg)BYm%~Ieum{M z74LzmNrX2Mk9;E?Z?9=pCNOF0`qRM_hD#?&zuGAl-kG{8S{w>2O&Mn?l}HMnD>}%n z&f8jOp!y=eEgP9sNSu|QxAT18VGYWYrTv{N^1|b))iiA2<;qINFXZMFElxnk^0r17 zhh@I!?&zr5l@1arR-=iwl{7lb&bDn?8Vj1)%zGqUu_ZbD5kCO@+q`Y<7T8;Bsv#RK zaq;QxAc(xI*ZKszG^UN{{QdU{?a8MhCS^+^9QDTYlXHCL-mk;Ak-x*PLbS3pFw`$W zxX56XcDwm$J9xJ%N%>py#W^X1V&O*uwXN?3JvTUkp102YJQqY3du^FW zU^UJr+afDa8DESJH`@H|#o}*aV6iHVgacwJ9u)|>-?JY8fvYb7CFx4>B@~o!ckX^b zL|kkLd_hpo6Ij5v+jsLd4tPOo^2;V|`zpgYYnXJ^TZ`dhVWx4_!a2+Jb~aT_F6CbK zy>8=TuZW3 z!oFb+yG~8kcTa5e-HD5M9Go@IZ1SDCP2A}1%f~l4D3;@Xj2ra(LTQ^b+>^PL$`C^aseT_UexG=9DT zM_WX3+vfFO&xBv4f_ZiCHsX!y%hg$V=R>ADLnDz`0r6cu3(uQK`0&I{Kr58KWq?-bH3r`Oe7 z*P3DE=*0?JvhlFh7)x3Bb7Pzx4irX?!+i%2Q%#|h*uW$fqf`kcC28^e$2~j66h-ep z*||{94xaT^kw*A>nE?fXw`}vm#H7KsEl@m4_x)m%k8<#PmdYjJ?|aYrWilZo{GSJ? z9kV07L{Pu|snkHLP9@fwxZ&7)MBVe_u+&C@Y93hycn4ZFh?}9dCN4pJg_1g3w&w(L z(_L%j`6NpuQq?tw?2{`NiSp8^-W6s4>KdE9;wIK^!2F+7IclR3w(! zLOe9|Y)BB`Se8Tf;XQ2RrVoP5Bj4OW8d+}!)%oRa5A4Vf*#Sm1x*wNW{oV!`P!G#`Lk;PhN)R zAr{X&!>s2ei0?^u*jq@5S7ru-?lD?D{SuTKN=f|0v*kr+!eiesrx^q99FM0`On*-; z9mCsPB0RyhW0{U`q_gu!?xj9@+&4_D4!+w>LyD7c6`rS(bkz3!MpPO ze%s!h{?edAYV~)hgMXWTPxrrUnylExf4=U56J{ObHL{V+-!Osnn9`wac3N&bbqYq- zgO$1zIvt1ai)9{|k4bu+)%4{er+@fxywaYdUo62~rJ6{@RfN!h9POFP!kmtaiu+=Y z;^led3evN;h%4MBSp8lT>4^zTwV&F!I)-!TqBn!li9jHsf9@wz1;3uew|I}*)WNsL z0f%2~_xp!DbB%hubtMEi3)=HOz8WXU^XuwD`Veh9o; z?oNE7Zib4dOkNi}p1*eP&+FS^?k=l$7Fz{|Q&gH(s%dCVwCKIZ6=w_KM7(@Xb!~(e z!wm;zd~j1Cdz|bJ#G`w$q!PG!;d+oZX=`5UQtB<$JIs^Uh^nAY;^MwKd{nCKX@WZA zRF5V0{n;IXkZG3vaExoAaq|rFUJX%q4e$BSc2%f{l;t((BQ?t={>kFp^G7^J01pkuT_`6W@Bxz`f!qj5(CXB6%F5zGhgh%<8IIUoG_0upzAdGRC)NA z()ZR7OD($BoTS$wZ=(dfBm8`^`zCoQ4lu=4AH^7abJ2>rA>Y>EOG>=Mcc?PLpm(A% zw(JFSc&1Xx4q%ZNr@ z5r0(qey*SAI>KtPk6LW99I{YHHUy8j8$IVP!Ev0wTq|sQi18zqsI!lkG2wS}htv}& z%6Dviwzp8k=~u)vNYpmvWP{#(w{HoV^>g}YAhXknz2vQtruc{Bm#+_p4DJY$Hm|+e zfPs|cjeQumBn*X%Q5$1w9>cN{`@xzQtX&V0I`h(e&%EN}t1`#c)Ri{gtp0gjNQ8d8 zx?g_V=hVEqE)C{*_WOJrJaDM@!;j;#WO@3M)ZHszlzjNJOWoFgU;vA+ThugXSU54n?xf+Hhy<*G0 zjGpiQ`{U%F7}#jk-s7JGBiLnvy&dc)O(nI=Zzx~&$^2;=J^h04Q)f A$N&HU literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_folder.png b/data/icon/myfile_thumbnail_icon_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b91e15fafc971e18d37c995ea02ba678ae1e5f GIT binary patch literal 4585 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_folder_open.png b/data/icon/myfile_thumbnail_icon_folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d928ea21ef64b2c33ae881476acfaa6968917dea GIT binary patch literal 5735 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_html.png b/data/icon/myfile_thumbnail_icon_html.png new file mode 100644 index 0000000000000000000000000000000000000000..2e991806ccc09cc39f6d5d937f59be063fefd702 GIT binary patch literal 10712 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 HEckx`M|JnK literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_pdf.png b/data/icon/myfile_thumbnail_icon_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..30ea8e9856c66a74061293685fa94d96a52c9404 GIT binary patch literal 7328 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 xRVZvUdE;XL8}azRz>WWpc)%f&{cb{|{t&7BBz+ literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_ppt.png b/data/icon/myfile_thumbnail_icon_ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..bb97df27ff74c9ef2d60caa415daa8a6090da1ed GIT binary patch literal 8639 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 literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_svg.png b/data/icon/myfile_thumbnail_icon_svg.png new file mode 100644 index 0000000000000000000000000000000000000000..92b89e0104b92d62201858667a1eaaf095b95278 GIT binary patch literal 8226 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 iA16V<@x1LJ6iDUX>k0edR1T`IfU>-XT(yjO#Qy zW<|)$io?TT!vFvPcnP40;=h>t-++Snr-LDlUjG8LJy6350DwjPZ~OpcW@7;WFme{c z!t(OwcFuNA=63dk62iiS_KtR@7S<*Jfcr*{l9{s7DF)y3&V!ItxPP*gogz9Ep`uWf zKUxAgH4!wDWH?d5I=VtXvZyE+&RBjpXl$&1G`a#UTqMjIqr*0R2fL!$W{P9YCML@6RH@Kj$UG>jyw9nF#$yegc3H)g)X5V9o=mnpKSy z1*kIu&`hO1ls_Bf&(xrgojW8z`OwZVSu^WIGWd5Qb@W}Yd9KedWcRvLH zA!d;9-#BU%vOzP^5ZbhIWpB&209q2}{tHlWw1_G$g< z%lq;CxYu()8o;a*AP)AjH!$@eU5q=M2pw#=^(RjJqZRi118>0mUI! zBs2P+xtKUYD3NNIY~kDZV3+nClz*2EP-n^i!z+QVOvecHNs0nV-MR1J834HJwCi7@ zgaY+9589t~`@R3IsgE=BBb=n6O96+Pym2PegJiyAkITS7HuB{Za?@| zKkSD-d$17c(0~w<5R9=uuA@FxRiF@M=yV+(wLZhrFFe*h1@q7(dj$Fcl{N%Ed&D;b zsN8At6;<{X1n5+Z@yU*`oHZa|iNv3chUGoZ7;nm|>@)PTfN7jh-+8lOmZy zo`OTopj=*2Qn6D3t8%Y0sT^0XtK?H7roy6hSPs3ETB%ZzBY&=hqhwajQx;ZXR%WLx zP~@xe83Ca&C_N}AT%?d+uXorrLI`X0v(cTF$O^tP)Fpszh`fG!-P@JAGyM~fY-QgwMSr+<)vNY}9H*yE%;J={Au%6`X~;k4$%ll3b6?{gT*_{=3vK*$1u8i zt01g1_)EChAjKeUKRBU%p0{vWEJh45+G0feko3@I#Ac+B9DOIb^siA2MZW{JjCOP6hkCYMIB zx{9VwqgZuLHQ7pMb!RDZX}fHaY-R3>*(9F5HHgic7Mm6y12aQRv)197 z!KP3htyLBGxb@d*)^8K7Su_q zA&VTPtVMA%OtW^Up!@Ks2&uqH`ZRv}ES!<;vF;;D=SK&feb0r*oUF#Ify=VZ+AH=e zi>t7$yeZZ^s$2~gr@6r~;XQ@pc>&nG6h^DvDqlHaxd5}~6A}g^h6J_h)w}K&e034>Qn+0Kot) zkoOl)Z=&8<0q#wcr-t=Q!RY*UL3F{m!0N!`{%Rugv5WX>qUV$JnS>b&gb;b(zbkW) z27e5q27TcuLc&7SLIq;&!_~3pnbO$Y=C_2Mc17MqQbl&M%$Vf3YUw1|sQD}CEqOOM zI#@ddM(9m7rk2%n)FrH?aJlHIYuIhAdv-rA@52sq4qy+xFw+^vbnHC}W(FQYN-@gm zQE0hSe@TbSawgvhB2kxNM3dd2x{<}gcnshTm=QC~v(JaG32Rg1%iaO0Wjqrv61vzt zNQYU9X^-23Dazx!q~WEvv$%6HGF=I6nEAN7nSv4%;vIx4h-8vl%+AdIn7U3@nS?Za z4ckVwGT^5`j$1XxSAlEL!L$gK{8iSZT&0F=Ff&mz?VXO8;7YB`rJ25*YMj`N=g7X! z`@TdOK-o`hDGrrVqr+4G(_LlB)xhiEu?cgC4o(xQ3Q@(|7TH2=vn*G6sg_pb+fD8% zV-=v=KM~m9{KM)TRt4rb#OHi#^-@Ppok3%_+2AcS2ZtX$BC-Z;6Eh9nZ;f)x{TL_A zZlX71E4it>a;V*S)^x%2^v@1mt`@tJ8J0p%j)2jw?q_N#^MW`ori+xaUTudXN7i{(wNuIEqw@t#eUA1X4- zrpqSp67P-A0yPm8r!T4RHagX^HV&7gpbMa%kR%8#tL;n6cnf^Wig7D6=i&&X1U+9l z*KTz1?C>fv*&_!e_97lfr_a#4&-n1%8?Mn_Rr`>O1g>~ycnp?8nRl6DSxTAjT83I3 za#Q^CD`z{NAL5$?h}o>X8Xl7O%HtLrr-6$}W_PpEIVm|lzVxqK`kTL7yiSZ}b}bR@ zt~-#N_ZLLJqfU6bcxJTk+MMqiHjh!&+SD>@x%F($oX>c_k{0DgJF`18YudG~+OIsj zo4rh*PjPZNX0{)?J#I0+SC(_R__n+6J?)-{pC5NIwtXEbK4&I7*WDZ~0mFx#i!_Z;3xcgaplgB|OF<3WLXG#7&06ho0wh@^f(=2snP8 zev}H&8qbpFVt)PpnykUZVDNoeK3|=gPoFPHyGu*zwec?gJnK9ES-UwhFoNGR?#{xb z`=I)M+3&XHhId`Kizs*GP3TAYZT?#Ss5Dplp7b**=^G3*{rLg-y-8>URFnY# zJjnn6{~!S1_4{8u1pr(a0e~}o0DwCk0Kl|M)EgE900cKALrZ$x0lw&>=6D>{8ZvH3y%c}yD@s=iCFPrrZ zm3%slWXeqxlL<*_LO~QRMDmlZMJ{FU{hdy~F177tzL+2SzlM;icDY!Va zPY`bYx&M>@tp9)i|7-ov-xV_C(db)`WcX_FE>Qd0Lt@vp#-^8+=f^Ob!D-ikGL#vn z4cdbM^=%0-`?2_>QuX6N3)_9t|9$I({~4U>xRiVCWe12An)g|(_g1V2>HH-32a;|C z)xTlI)o}W{V94PDMAy{)C=2;u3#vv{(`vZhXf!=D^DO_si!erP5d4E(&8la$rp4&i z7ch)<2tuE~LA!$(U5TDU`y>OJJJFTn*~qxJ1@J^#*)X}$uriy?6Zl5d+=U^s*1Dkq z%x`aZw`$Y-wSX2V)9ZG<2vA5Uq6?`L1#2YH0(YO^!@|P8MYCc}AUI!5RS<2V_Npgd zt7GJHxLru2xSXHNhY3OCy`C;kPy1{{$;ruOY3bTyxzhd**HJk z)veU{{3(_6vwfB`h{^I@FV>Ks9v>av9xMQ|aW+QfbIk}v;8;n%&Fr0U8bA`}?aiu8 zLQ?gFPwE6;2J20idW~VJDs82N;lq(YYaQXvyXCcu=XKQx*W>SC;CJt%o8~6Q&gR4W z)2__ZvsVA#2lUWCr5pSu;Q{1GrrcKBRVea>g@uo|w+;vd{98}3JK7GmeK>2T6H&~f zEx*hg(}$?iCKZstCI#eOK>q|DOnh2x&}UBjQ;5JI)a&|e1TrP_iArGCh(XwZFKFV5 z8%PU9gOMP`4q=0??9o6bkq!y%Q3Z(P7yZrsc3{%t&KVtQL7$xy{SCt22PDy4AiPm<22A8bI(EKQNgqy3ATHuTgp zX>r1+@me0*$o2`X0PTU3ewKcTQD^%CnW%t$jPrn!zSSM1Rr9#(!Gl!Md^Chq_M4tc z6|SHqpN*5cal{qeoes7P)tx)wbkZuIRrTK$w)b3%b8LY3C2#-EqYECz@C-F+GcGG5n$@ikz^l~6#K+|>QcpY5p$|Ng#$&6KWbHFa^J zDkdQmvQ(lZd8E+kc4DGHRD}Va4oA|Fy1$Uw(I~bI65dqh6m>}4FR_C;H3f>*4x4L) z;6&=?q3%%ZDUr11(JFY-0+!x)U0XQ94YD!;m>3UykypgLu2 zIio0oDFtr&K>t-kU!R&(DNsbxlLH!7A-_%-#ovian^#v}!5*rt{6D5J;O8bg?guVaKo zkQ3uond%a}(Kg$b`p#O0O&bR>adF>+omU-|`yIB##Y>m?{a7T`%{q8d&l7!*n+ zLIpP)xGX>StZ5k2Cik~5@6$4Pxh7|i2=- zuvFZAT3H&T&=hjHT~}5c=ouLB#-0vMvPogIYdH2`cawTYQ>i)H8x3JfPB^cJm@_wS z4-!jJi1!)2-@*?zXC`(%1GVou+HUplLwk@k(xnR+Qa(BFumGD)CWVlU z)5;~kze%hppcC|?1(Gn%RSQ!ce0*t!GIX>4hb0`!Ph8dLt3wv3sHnA~tG_|JdLyaz zCpDqe`viLrx7T*xRE8M7ueTo8{f3f=XSYHxr>MeWI!2}!Q6JXAFMWdweFnEQvkLZr zsir6Sr35Z6p`&5!O3C)47w8Z^aTysBC2l*iw-Z0byu8{xUuY@VZOnuhnLi(rIPE&a zcFHB#cX}Z6u$Y_zFd;Y^oB3zmO%MdEnU5iO`MW|)lgWy!LEK=KBc_?1vNWAPLsNEl zoYme}^h27kAx28ptETxgndB+&7N$E-U$gQGJl@by{l4v-WB zjiKa{FZ_)P7O9(N6Ufe4FiP$y9D)8U^S z>isCau%UIlCoqGiO=)|BI3$m_#DWztV=`=P-9CSh$h@Z3JF;K$H%0bOGG(Iu%@xeW@xv+p zK0Tp?z~_=deF=l(26?3J^V01Qr@MmYX{KRz_Td=oxdErtB|^Hg>ux0;r#`l|sjlwk zoQ@~8*-dqrqUYLf_T-*G&*av4LkEZo`-5AyI)t>DaGQ_!aA)Er?i;PY_sxXx=WatvyD8AtJUzEEtPpl#Wxdk^lw0B#wC4#0SBD#- z5))8O5Vw&dKHCB-(Q>LT{H3^`pI=~i?^H~vmVyZw%b}(jaLKeYFfh>DxWdljlkqgh zF>PerURilwy7{>MW2c$0s`up}O3yF^Z*xXA!5^1^px2M>rXgQ@q6t6sKA%bz`$4Sq zT9MYtaTNc`V^2`F`-WHGvE@^`)8k9R{PcYe@&1ys#D4d^4faLdEkX|tqJ4>N%$i?+ z9t&c`_8>@2_Wo%UpPbt*l4AFJuq*jmaHRsb%Y)+{V+-*ciZ2Os-RA--&gVfqBaSVv z{n;1a{lXx!RBkVR&V9gawx{!@)j@igO`r8Sk8eVtLbDLjDnw^ zKpKOdE*=}O-@Hx4{x7BLvo3iTuS`xmCDl!lshM&Czeh@^z$ZuBqn4h*{4~?uJb@WA zJLkrnGakPCEtBnMqk#VP?w3c+!xPFr5@%%AA$F_ZJp)uM!Ejzy>CHUBsHSkavKZ`` zQQ7Z0%vnW#ufPIGT>jUO*0tvtfy1RaO7UwC4uu+juPai>T(3wyPS$PAC;jBD z58M{b14m~2Lr4cm+Sd<{;B|6>Z4^=6%v?gz0%v;Tc%d4?eWEW zWA&=r8das1-XvKHr&raa>`!cL7^z~EG`V?FaIL-XB)rII4q(>OLQnipjDxfMBarlY`>(e= zw@4zf2YutHXtD$p9;;qV6mbUtoe5Apl422cDTR_^jMGl-iJ=!Zw}u~zt(fv z8A?PeqMk$DmOSnW2L4+Y{!j7V;Y)#AmZ4(i@AGOm$Mr`COP3uDxED2<{vJmL%QKi2 z2PJgUpFtJVI;Kr!_V6#M>r_5IJ~93Mf-~7%PJ?Y5IP{v+S0hC-2{CMOCFdQto&>{| z(@H)#Z7)iGd9c@CfD^`rEoSy-5H#n`klU0fj8dA{0^kWX*qnzI_HExZh;LqNt&+gXFG-=zoHS-_J zx{g1?c&rEFx*yO^-ox4|l9FHQWF<`Cd5V85HHw3p*9^*@wr!lV_G?NO)!^lwYb1Cpk78XbE z5xe3xdv4CVzAqdQw!L}0Dx5Ajy%G~x!omXL1HmD{gPKwB9n0rJ2 z2y9?ldV7CeiPiadDMY+~di{B(Fg8-!Ggu(^1=h>d6!Kkd7mla*it=vPlhRFrP#Ao) zm)n})eNHp>2SrDYKk$$;8ND1DnGpGbmNwr~=J%BW^)UUN&>k=>yLkvEb0r@ROvl6$ zha;)$0qz=jR_2{?#VIJQ{f7lMiI=M_q4#4f?hfx~5dkx^T}Gh-hxX)@W>)X}Ri}W< zD4yF;&H2c`UPF>9C$%AZNt0&P#clQcF=ef8m{C=OX{DlRjG84h5&$WfRv5o>pcy1- z*d>%eG3t6VA0lwDJu4u#U>!e%9Cy7j>0OY8`piF8vimK=Z+`&pnfHOgvgvj!T`-lS znFNP$Kb`lY(L=|lozr1dj^==Szlta@8dMs45Df3A5Um&QE@>DeyJ-UDD5;o+@Cp=0 zx`9K0?c=ZHGBWZtFy@)Pz?Zbk<&=P(j7{2BuRLtB*=+H#-tF;`YS*TB)ZtK-v>*z$ zIfeaeXD8w6-|8E!c6E04w$<0y=c1=pyV}08T~YN`suUW521Uw67)QuJC=UYH1{KUi zYqK_x!Uu`nBRYeEJ2hC`)7+QMlbk$Yz_ld*s7jCd zF6Qyk$MZ6D{b7aOX?wVJ#WSuE6(mFAWFsFj!iH`9$F`m_OaAA^ufp2A?eE8DkKGlU zk5(bXgcc~8x|&IUlGj^dIVRU5kKEVO+22JbYC9*{=PV>T!T;cCRWPikzq*rHp-hc# zcVw5W8ARAiF$2R#hYA`uq_SThSQA{ zv%vso+)!jk{cJ+Q#Zbm_n#J+a)Al~a+}Ns90B^6G38CYXRKqiHayVW*@n6rkr+*vL zhfXXL$5MGhn0|VCa_iQO*?jJb;UX09;1cVojsgy;kH9NQUQO;k%-?;H`O10=Jj zqokFD3Qo4bzT%RnY^<|l=)L`l@BP|xTYvZJo$*~AcIPUiPehyKeLkJFw-}|r`fT$9BT)HVFAVjrZop5-CtuBr~ujNnPJG5LM9R11Sj2(s%G<4p0X9+dkCG_KG1hA8(hhil+V_8M`6C+6o z5-&|80Ef;eA)-$SeMZxV%IT zNR%R`w_uV`O%b;VU_g;4n#FrIkRXZv2vM#`!$!%^C4-JG|C$0BO3bAN)|%M40Ykhz z%bGlkbr}^YTn6B4j)ZhTGM9CgC`6xtCXdMS5Me2rqH&0+6);*b91RJGsrNGyGxy}|-}`ib zcrab4FZ7*&bai=jAtcDXBQ{U@?>R#}&gP8Jb9FYBXS~I-aJC2(Y&}zX3hExA1lW*< zt2G@Z4NzK|5U&Z{++a}x48_^i*GYm~pLhk~hW8(g>n&HUgssYDYs|hzgols0T&q7U zke$3p*|wQ#4ogZiD}8u=4&&qFo0^`cvzl)X%mzaYB0--3@>1OtOUpqTN@yPQ_hARI zW9xC9a)m~3TU85g(EfBl7tR&L{YDrs^c(xsl6tuMCTv_}nbPL$H*A(vuSIfCOz7c- zO>)W>aK%3M&bq5nVh!6BbK2C+YzU@7U%_U@AnHR$v10L7kEn-`;{t*iB+e)}G`uVc zBCSRL$XA9~Q6UXbwd2tg*K1IwW`l%;%*f6@I_?5ev;)ZuO?)Mr#1dv!s)YUX zBl0Opeb0q7qAHEw4yp=>qKA>0bGoSs$4&E!B!(u?JgG<*kfFeYJH$Tae530Bn6zAO z4I~tfre|s8YanKHcqjBYVk%NcCu8a7+r>M|37FAm8wBMLdmpsgd-VUcFC_CqxU@YRQmnL>|Ps%`K$onX68+}zk3ZMN84_MNwF zxK!yx<)AoRB4w^zB)9PaZDp{gBqU^^lIJNGE>_5zafO5oSyd&g{C{zRO-SJ2tq{h@ z9MUD=*HE>=+zzyAcz?*Px$SOix7q(VZUcf(7sF(6*cJ4a{wih{jlcg(hbe)5|A6?k zpt8~5PIGcP-o9ttrw~~p6AvspM8S!funiu53zu@%mfj(**>{yd`!P=QX>4UR5WluO%mU5ZNd&Pmx4}P@`7nZiGu1 zR;ob(Q#^nPsfVyZ!6j097SmLnA6U4QOe~B;A$8hve#c|QRzV=(o3PhQXwxW&fBw0} zC{~Ef^3~!tx2^YQtTFB|4f6EdB|Rte_%AF4G>*(!oOgoEb=d*@MJc^lM2OUHw#=o+ z(!#d|ONY!fEnb5JRg}|Y6I5UXQ>c89y4TBiOH?I`auk|giQ)dRU(0f) zZSr)UXSUZzwv-CViMk~u1A}7VP$X>5THic5MQ_lUKAYIQhk^^%qpVKrkht=?p>z3X zI!mC%@B6Em5K0%Fr&wuJs}-7PqFC|N>GSh*)klYir#R&or_dfuL^6g2osco6vXx_O zl4&BjNjN8v6oRU+9>jo7@zdK z+9_mKEB#DbRkj)$sI-!Fu1Dg}k`KE`6U@%mtbOoKUO3 zscOj#43ats#k4L{=&!OWmLEbuW7QpbMZ@5sDD1x^yZN{x$&wyb5q}*GpDxx$I|*K( z+P~hZ~G3e?>>(JVFGAqYwF6551Y7M z3WWliITZ3=IYw>7M+lM z;8t+@>){e(J|rOGDT781>;9q7H8~hs{5PusENLZJINM`7b~t7tI$|R5LZwiO#36mi z7({TASlSs5AI2LUECVP7Oe=f946+l9IM#LdZe*F!p>IsC>y6QC9=UveAp!MFfrzywPR5=>En1Qkl@ zO!@F8eVbIe-XH&#jgTf(QqxN|$V2Aa?Q`)KrADLu^PZA`Yn9c~m$BW2E<7N_);P{{ne+kF?7 zSuP;ykrJ0^o}8?ny1<^%0(`rODYpqCMd3NC_WmQ7sYDn|r&Jcxs(RKQ&ovV1H)S!d zl@jTSIxf{M^9nSE_vxNK^Pb5Sb>Xe1m3^@Yv;-mDPBDc=u6y*Ulv;*%_*$0-7LHna zZcUwuG0o#JOz-oF-r-zG)WzV_f;D{G_lzR zk8ho}7FiTA;I^^D7f4EZ65NT`&vP7;aa#Z_N)VGp7#UAv%*gK;!L_EQgK*ZWpr70!$(r{X?Zo#9*3O~eaBTGa={2glb7G)2#7n>Fd;`TVuT z!JS(jI4WVoeqfn0W`b^CkiZ?sUv5t{hf}bHS*O!+3a*zAqLzzx@bY|aKEdBO)@>dF zF$?4LZaSu@Ff!TgTWi?3WD2TtQ?hKDR&^S^t4$hRh2n8v+SRIBh9Nl%)cCN! z{#8+T^@B>)3&VH_?r;*d8lJv7&07&_2+< zsK4GqYHAuPzuI71l8Qc?GwdX}-RRrPK6!6oKJ8}9pEKCeAf4_VK_0)oZ)pn`G-wbm z7LKqB*S97Lp2ybY7taG}6jM4oTTi5|D4-Fks`A{t~A7)jvRDaiu8 zXmPm(5-=L*;kp22NV}&GPMYqlS}1|pR<-4~+JvRWx8dp<2~b7?n>MT;s|Yy$Hy0fX zGqMpHgR(yf2oV2KH-?@ULzu3WW*;gaP#-wUj9j zC*0xqBlg;`8--YH1V(V(MLisz*(eu_CiTRICLxg4wq3o`@C)7I=U5d2pC(uUc_jq{ zuy4K2K-g(Emyh>p%?MA;3(xHz>9we*+X#DVt2r05D!)^NGRD}XN^rbc@b#2DlRj}O zt!|3u&3zIJA*@f-pTyf**v(g-A~7>^oG>WIM&%H;jB=9C5a!{ceEOX%GSWEKH~i?t z`X{Xpn-QS}W56)Pvw3DpJ7$>lck86V$r#k~ACzUr65{tV&9KmVs=;+^N1?jp5SZ9_ z(v^ImT=jTWWuh;6P+u1=L9LG7&L8l~SNBVr;){(GMdCt~@#86# zeCy2qmKRsql|h-q{-*4Oii{KyU|a?T671R;O4K4OE+0pfEQ+^98U6HPmm`J=E^f+T zI>ciLmo^RXA2k~GkXAz{f;au5zWpF0r(g*1pWmksg@g%Kh{?KcgWQKLDqlEkPv%R5 z=L(xX29bpNIxL@Diut7xm0ASatFc}$uF9-=Zpq>**$|s1?|`?vhXV5(>Qu>UEIS~x=Y*uxYl=;!u>ZQIX8h!SpL?HmJ7-`o(>fp@#@ zzA^dSB+OC=Q_@yjywX}mpo7D|E<&68i4t=VqVxKTv-Q!H#lz$WZbTE+=7=#4&M-~m z@@1y6wT2r2lrujDQ9cVu}Q&Af-2gg)Ev-n7lD(P}*h4r2g=)ll$DS(dn#t@5so= zP^nQRQq(t*l3hSGp{jR$wfa*cDfsL3%%bNe$}dhvm_DrM@m-nX>3*)1e{ktT6vA$O zHoR-%A^}sQN>n?$!tq@Ox<5Oy7X8t97vjbwgX<2vi2%nW$O3qac9~hn>$J$nso|bf^0`K%i;)RKg_c z);5pyLbk!xm{j)5+ae`JAGu2^breu&f&+d&ntDp*Tsu3%q^S!6su-`^UtFDSt~s`m=kA=*o+p=@T#p|qG;=CXWptXZyPlB5W2g*3 z{Y9ARj@IdEI!-4OLL%;gdI0(_DT4q?vT<-YGuAFtiC>%EBP z@_Gj#eh*(-@A>KB&Xq~izmeKE+)}Tujf5i_7qTdbf4IjMGY#9xs5%-Iz{8w_4AH#o|>nazc`VqxXBry31p~ZQ0(pY zUv9oBm2rM4d|IJDFBzCYVD%BH1R98~WKdYs~SKO4>5Zw3jDQS&}&Pcl=7 zW)tkR2^}R#m7JoFbR4^bz(TmAlF}?>bqn|f!ek8ZJo0LGh+E>#>UQ$^>jLx_gIFt+ zq)AOGG#!1*XSRbj*S_~k(*<5+aDP08Xe3Ll^*) zOGqGLG}YH`io0r>o_DTSGIZSxAhx1M!B?(hINtx6etvp-`kJUHYEdDSJ+C&`*P_zj z@AXL-?Rm-SdhY35W9AlNJ-$EYi0#} zLp_?2wM#efRLNR{dur~6P`8{QGSs#gxWy*iUQ2*Cx<}o_sxIIkVnN^YKxR4=Cx6-* zBL5SY^(6IdYeh@n+M0r--5(@V+b6;+%(c$Q69F=W_ntRpQhbfk6|!*SgciKYo<+?{ z0&G=&H|`&SFYxT%F)XcGPWyX#iMQV6ai6yFzfu$U-uBT$tXVr>poyHoXkDhe zpE`n~HTwSgAn@%G>bgBMKZKmR(At|r@Gjt&;1n@L zjvOoV*GAjW{tAg_2)9tH^|z=$j3ibP(u)VKKwqk4Iwd(fQG`U_ZA7zy@hJ%JGr?Yq zoB`w$5>47Lr*R2#!?q04F|sqt!SUPQ>uu@pQ0$~xUvRzUMLKoNyhGHDV=A-w(TPJ^ z3CJK(tt@hxN-~S{d2*`B{GZ=oT-j(ocfm0ex|bh|2v6kELA`4Mgo z2W(33P3ce8N&7-;+E2UaNtwxMK9i~ybDMMvOLA;z&jT1xDOk=B-0ecG`UR3+&f&cQ z2@ssy=^Cw!B>ag;D|Uz4jGP6-Qrg9_7MsnLw)2|Kmn*m4O^4=Hht|{-7sd0MWX(xg z37o%)U-r3>C%JooMqp|14dl%`yMMUB9jgN^r`P}qv+)|YH9lpX*QzZ4H$g98m>Jeg zPoJ}W%$zC=6|JD{M>3=V-WFInsVbL$5YmpLL7!#_8oi=cQB6S+sBD7ax7fslfiUmz z+|g<~n)UD0t%=i*Y3UW=88w_K@jxA^5r*}Og=kBa1CuiYb(h;cW&ahjCTSESwS3AY!IDwa4MJmH3 z3RGg~4(9et_TD+v|K?xHZFO=hoH_ZvtW~%;J$&}PhPA#tCyO>35#!LOIEhyjlplbh zI0Ow!rspj0L=_{{A+Vqm18Q^p;;3*JB1{fqWvZ7z8W?3jOnQcOCL_uk>{Hm(fC zphD<`G(j6+%~L+ud*5$ARHpNYu^UE;V$5`lIGD2(D`H-2dq<253CMXBo>$`nH*8l- zwaR`2R`0tIc#fA{ryF<_8$Dgh#**75L2&Nlc?NqLgu|r*h2<|w@Y%WEa%!FOi^{D% zJ6e>AgstD{uWny;ed0D0*Q3q)U-OLLdq$) zD7@O&nuC-=n63y|%650FKyb+PM3? z)>|^HK{d{|T;886VG05yu*gYS@hd9h@|T2NsD#LG`Vo8LA_nD@sNn3woID6@q10D;WJ*+TaJkr48%q14so)K}=k@`Gu&E5TGdd{DlLJNSSMd zm48J+to)JJ^+)%JPAGr8zy@#iPXwV^TmY`abILPYXLv`NQ6Mm@|246&gywSy8CYYV z$g(YAa!C+UBiIqb!(*GXitMw2RWjZTlGc;7qWgz$)oPexwp>eRbBogp7qqZxGY%#tGlP1s>;fORVL%9u!b5DF<|yj8f*{+m5?f+8#S*Om6jY-s zG6fG~)}RxJaKb(;ScPEdEGWEEmdKO=$q*zMB6Q+H9cp>+b5A+3{Q_ zI0YOn@b%OpHgY<+-Fvej?|N7F626tP-NnuKu~N@xSzs3p0lqgZzcsqW{%wp&_vLEP z8fSv3=i5e_O@IGRVu;Qty(~03(wqj_0FUOwIk7{zygAC~h7YCH{~R_P#Tuo=FYBB* zhDh>0o`c*d`#Gm^^zl0bkX)UH124 zW3nVMAHe`pQ$KbL8c3y)^OguHlMqyLns|JEwdf@8M$sbdFOwsPItS2lVQUnksu4O$ zgsziIG_TR{v=ZoZDd{|}F=LBx$!924oPP)Ymb)@mFX)(>AfX|1bam6)0^<|i{9X#X zPJ$5U7gvW33ui=%#oB4&oP&}JtQ#_$P_U9zEu-1YZQ>PCC?IMp1$4B{oVm|Hg6brm zd^}I96V-FB*cv60J9bHbR4c92-TitcW&Y*v5ncatbjF_z%ZAB;WID5YSTaP$uqcg0 zpe0Csbg4vc-ds5YYfEB~fvDJn1moSgL{yM_^3X-WyQ)|b>mZ(ILdXRpX5f6sKhdLR z?1$w*VWqYZr>~`hb)dGZibeHu=0j1>Njp|`f-iKnBUVlkYtfK#99V%3caU6(aCcgm zfmTxPqG-vI3m}Iu3KS@i_a$&@P$**MoQSkaqh6U18>C3@TOi%;Mxx3oGW~Be3hiDN zQ!UIbDg0t?_Pj`B8>&(1-){rmI~cLxh6Qcv8zUh!Ny;U&BzTA_XJ#vx!xqX^t}X^( z>V{Rzr?Oh8fw5}C(zz$aB>Ex2-W(FYS)$C-W-o~asiW+*gR{gtxPtGHgy;warBT&_ zm_Rfx9~hW$bil(<;`0+G6FgEs_WwOKmQS z`2agaM{2)vemrq3lq|V6G5S4%LLC2>b0{;uNViy{Hj&^;xGk_F%ZQ#sNJ&!Kknup1 zf2Uljlz+*bRW~(fVR4bA!C)|yp}Jj-r%$WY-&^M&t0mSE`G-9oq!s+YbV0{xIOgm=Rg_9O8;e7B z2d|s~9%O-xq_|#-YohZ`(lEw*9}NJ*$hq<(=W-<+m>Gpd5hjtDUIwB5p~xXygEKl? z=xCC-K&V;t&X^c|&^wbGm1a^3MKr($e!_w0&0*;{e>T734^x-SNB!%uF938O&uy!| zqBm7ndI38p5r|HRhsjY)XOBm)kMuGFaDFi6mTuSsF77of(BulQjbF*%56YYDA^Ss6*A7zGc| zJr+2E7dayP;wRCNR7uVzU^cGh%8#+d=dz1eW{B8H?IB?~Aqq>c(jrE!aYbTvaAo1${|{|%Qcj-6rGftm-o zkz6n=j+%K+T5Ha4cIhqoGOVJoSHCc z)N#ftObLUMq&zK1O4l?jqaiSo!Pbp*u~4|YNOtvE_V2iUpLTKHs&_xf715ZKwFsz# z4vsw>S~a#3(@&XIK0py80t(90DyW{WF;nSOrKl%d;WthQQXq=~lMh?*$`djwt*epH z%kpumC9!g@GDPE36{`Bru(F0MrbEtki7VwDI?$=630xwXklHj&7SsPTpYEs943lmiY3*>hS!rqPV@Kn{W!w?Zt6zP%FnuKlJoSxE#V#>4OZvcF-Qr)?m!is@CV zw;k6WQET7UYy$V|x81-|+|6U9S{S57RS|b?#2_=qCOmHKBoXQq84;9uUd6#p*p7YsG=OTY0AXK(uPb;W- za)C&#SBD8a5C-PX4X{C*fU(C99*=QF`hg<5gf#tyGS4{ba1F_(J(lFd^CFo{vlRFl zL~bjf+4vCm^{s$yl%ZwvE2+Hc60pg`Q`xsx!~B#Wjv6nt!@23hc$4dndO zukZi=KQZO5R-6cHK8!d6X%HQISr5y{hJ{$lzHaQ83Rx|UFLB4VYYzHn)*s8U`uw6a zWpqO=0E4~R^ny6mq4>A8m(wtP5SauXtVo)T>x$0GeDegFd{ws#T;OlWb&OS;m^3OH zL})Pgx*o8NZ_9Jg)2e@l(8i^ zg+DAsTK?riTgN(mC(c{03Q??F^Xg=2cMG!cOrq=AfI=ilfkDlEu)o^Z&y6-SW%h!Tksx?BW6UDf(>3 zcWV#!RkpP^-F}w&CB2wl<~$6lxEoa0=j=B1BqvsgWSM1UG&gMc8cQuCOd;=bL^&<2 zO{wtQ&spr{%@t0|!z58k@!p10-_s6T$2FsZJ%2lpK+{T0AZ7S^I`p|k$HRc-R{)k? z29b`c?O-#?&f$<(%2~zX?Vj&3sZk&nzQ_VRTF*$by=jc8QtWb-7Ej-r^Ja`Go@avu zofE%Q8t2@}>K`x3jc>~5=~^7WLBl@wAqE;v`@4ib(kt4>6gBeT9qkjo1>Xu!ip(p4{Ba<|)| z?Fqt}SpU?^h;$U61z0h($QQI0CAn{l7Pju%-6{mvKoU&zCh(s=OFj1c(pY#u0EZ;^ zXO9}d@HgLfX&EVy(wD$L zzVGS{j^_OWUR_+ep1bns$WPzuZ{HM2RRw_N>>i&@^mDz7nPYW={|rv@+>42~mrW~Vf}8H~*09Sh-gM8(_q!TtSf`)hqDR8=I}h*nZk zdi*wMz$_b~02z@hv(7>EOg=l20Cy)l#iO54ok`7~wU0EkX7d%XsvB zV*xfRpunU)iOD~EoX^w37$))`H04l+% z-~qLX(VXSZc5M7SueL8{(y;odXByaP>h zdCA}A^s#Ynvf&ER-$LVN6{`jp>d+z=pHmtB{0FF{IjMnK!lWHz1{^HvIl&u zd_rsNk9+f5ZbUa>265tk^r>=S%gQ^;gU-%dnFH=~r%%=ym{S+*?cKzee6I1qX4LJb z#A5HKoiSDXg+sSEF}aaGyG$+qxOg<0WWaDpu4efey2`GvxZbBwSudg=rA}+POwVR{ z!z}fK0!-=x7f!KTWW}iJ*Y1D6l%AaZh{kb1tAo}kuUH}NO#PlQmN3Nfvz<}59&Pu) zM!*-uY`?SOMT4GHM#QA1_oa1W>AeO|t=5YTo|YwSfYQj&#!)X>M3Oy4wgvi|ZLbKm zaqjx1TMOd821Xf9{=2;L-c-dzV8;r=MA&qaPpfNu=r#C;f}qQFi{nY>0|OdMkO{LC zV;g?2)uCf;!+vdMbyH!m__&yLQ2bJ!JQ?NH^_Q(nulN+VF~2h>m2X%#wIdRs`yyAF z)9=k6e;Rl#qiQd%PLt#Rpz#PgYZ?F%!O~)@Q#yQ2y`BrZlsDpZWPA&D$?9dxP*)%s zW0upIG}QT5JywL;%N!<-)4kZxHb(V^qgYc>j?tQ{*M4$P%wj4u>{`xsZqgb7=g}Am z{|q(CUM@Q|?ubiJ9R>pa*0m19gh@S?A6|XF?N25Dtv>a)`TOLN!|g@(T2MVp_QQ99 zxaMMLE_LV5onyz_Rvvm@tWG2DvATA~`dac@cxCBt_V4F6K0Se)8(P(~;mIm=m#$MN zlphbaw1k$W?^lh)(pwT@Bs55m%()$SYr$OtWc=~X(Z*ZhVOstR7Ne-qt7 zH9qjg{3&&QHOep%rHxaaelGiT<&V&eWMdGPc;UzviMwxS(nsl#dd2C?kiOJ!9iU6n zaqer0Qhyr+)w!|Vc`iyyfUKjXDDks?>^vP@tcgUE@9tm;RxTYXqr`4e!}R^mUnq)%A*U@_i~)j zbs>o&k`G?}PM!-GJKX>M_VmBv?d!)c>K1froWDEpNEZjii)xcS(mJh)Opoio``4ln|sFDd}#wG=g+VBi)TOeDCK! zc-MMotvU0mWz?e;pHwymm^y8bA(MF3QI4 z0N{}P*C8M|l@b7KEn7Lc=g)1NJ)GTboLyila&j;iH)ktbhqnNHm`&5Q*3;c4m$+Cw zlT{0a$Ei8%kYU1fWFz3DF)SPmScIyf3|TW|+U-ON3TV`QnW3nWk?=2M+MKxI*ncqA z7_uV+azexVZ~lJDv7c(b*ciO8nU>rvK256{#z0`=#w+t{3&L>=W$B2P1A4o9{;qLL z`(rb?07A^FHw^A~j1X|?D=z-zF#@9%Kt7D)U;>0j3WAp=5*VxFmC z!byR&SEOtnkXD4i(-K*9K_(io7|z^h_tr3}jJ0Ah#`rxIY|0$%OVAa;QE30U+oGJXJo zNq|)G#8CYBNh#qb2NJ2IO7R9J5e5Gjm|U(HhKAg9Y(pv(Pe_Gcp}b0#=I;2I^ysO- z0KxL~|C4qDe$lRVaJazdG8-=XshMAf5wY5L0U9vA;^&9%!TX&cv z4DTGSe8q1s&X-$PnEaob`75DaE_eJsQ_rOt{)QE3IlmF5bX$k>a7#P>xJ$*d!H9!& zRh!r~Qa<_1>C@cDVY1)YyP3xx-mENf-k?e@34(GvNyw)dt^%{ysQ=Vh35`4uD;EHq zGVuwkOYZ36xddp;aW-6>@<1GtsSH&*~&$}@56^;b#tVgewa>CaIvLw(jx$%%l{ zw4=|rBA&>#V{KRu?#n2jKri!3c6%yS4Ja_V1oS$CDnec79*(4rxUIR z(^sZFk#Iv12{Bb{j1lVtPe0!VH!JbQ`B!R7OyJhYH53R_1uACajJ)ySOO7JXOc`;j zrjqy~l(jihWJ53;B`Md-i`b&X;O}za z3Qsg*e+2}V5Sphf>=m7ivXQ!x<{#w(7!8vE(JYoQ7HXh&2kYb50<~(EMxv`OO3SBw zAx6raj8nu>Bs_$lLgl)InTW&Wp0YMXqo`E;&>JHjQyg>BVcg~{Oc79~VvPMY`^LT! zLnMw9_M|UpEp4rHjem`Ljp5`4cABNM>yJy_6*irIJJm<)gzEz9(6@xi2#KGCSt4@$s{DpkI;U|~QW&d=u9vAEnpm4``3a}K;fth)>?`clc>?MUd~Z$d zf5s=o8x<)RX%{K&wg{E(=cnbhC^Q-0_~Xm;s zje}$zjfOn-JTY}K_1?kXgV}>qNrEX7eA7=iQ#MnkQ_wbY3D&~ORP_$&(}K%47`vT{32QtT3`2SH&Rgp(Z%GU)B`D>?z8x99&4jv z!r?#stF|M5Lx+&vI))dwa?g6Kv5n*bd2e=a?xl^cn7W!J&R6WjJ&Hj3gou{Q# zrF85U%#|Go9oQa(%xC--$Y4)5=64_I?2}v8ULTdh$@tD|zf|n2C8yISqrozu;OmgM{xAKpB8J&b~U zI5Wf=HOybe{{_m;rI$BDTcnie+}nSZGy5`MG8<&bWTHNod|q!aVX*1ji!Ncf*i0OX z8M4I>dhWY5HG=VK<5fhbFD`3PNRVN$RHRF&5!EPPf}rQnY#INIoBHkSqr0^)$!C9Qbg0qli$M}pGt_f@CAH}iFTF!$)FKi zYrSK=VfB8X_-#<-eYaCY9S_}ij9>Ou(Z%S-T-dd;d0ToWY||VVmDXzqDBUt`j0^6ibvP1S`|Y1q&0%lI2dvl2~5*Zp49G1NN@M*Q08hKWhq zF$q1LsHrErO8C9>t@mk%o?LiBc=}&cdsY}-p7am$TYx#Ig{xCI}E+Vnea_Z%L(S32gM84qb z#(Fn2&@|)8dQj4=)ogwyy)QE(w-7QZ_2Pd1&*8kE9l|s7baY?ZjMIeVB zl@v7)j2FC{{!CItWJSvDZu>T0ZureGOFG4U_WeL91v!uJ<>c=4&}ialR>Da_Y@4HZ z?%fVz_fgqgPe%`3>#q;|d@s)oZuZ+f=RIi;bCw9S*1TbUY!5b973aDm`8TnTVq+iB zP!msYU-NU#A@wHgwX%)|0A9>U9U1_@)dO{I4U9q;kChF>K7_TCK)4xVym zG|wnagbJxe1gH8BuTH+AWs%+P>X zqaJ>~OZpo)(VEAGx|CZvy^rv}aq|xvy+KlG%ePBGt1O-#qYv+}{1_oF)U?B?I~Xv4 zcy_@0(1eL5fkETDcB-f&VN}d9QoW(sskV_aHR|n54X}v7GURO zW@Z**Vq%K3EQ+iSCjqy&w~dkyx9&x4Z4ZMK=HAEDZjGpLvvrHIg*624j*-l!ia+1) z$I+h6QX*+0&k`dE0fSZ5M>k(z-<{9sIKQ#5u)=in)RXuU2^<_9TPEh`Z#$Ftt&2nO zX+_PnwMWqq&}C6tAwY{3NKHc-Oom2xKFS7w*7?1_3MvFGrn487(pe}a-*LX4@AYW5 zf+sTz%g{yFg{{4P(}%r36|WDQPc=0Z6uK{fFRIJe$lWenVLi%MT_`{^fBbbXuZX#p zCIN((2%!!X!38jiO-s9b{(2=Ogs-@kv~p~lm4cF4}o9)WSvgCCNU)6j55?D#F%94s`^t7>VP zPfk;twRoMo$;owkS`VdGq(5_Axmj6Rf$AJJdxh|(V6t&?e$i4^4t-hglI1#-D&n4< zot<}aZhU@zZk_&dBgu!1jLcdDX37Zjz*nID!VGvftBmMzVYt$0@GvpY1Jl#X)hH<| zUdqq&B6pX^tGxpQ18tn#-1qVF$!RHL3#1z-gx}=VEuO|a`oY#;e7-x))8E%;w1SU| zT;pm^l%(hx0+rwv9Z?3jQ7`imP*iBU(J1h4CP3xIlYR_8YjEGZSNads1Iv@E)6KTI zYTNMvZ~}^<<&@GK+d&_~hsU>l@<;fR@c$haf@~G*c`O)~^i#M3xJO6$prfOwXr+r^ ztibhn=3DpGuyP+~*_zptQfz5;**{#HRjVYs%o_I_*Vm^@-# z3rwLHL1ABMgd-NMiG!k!yVzvTL{BfHI_<6rRo2uX_NusGD>kWvvic$_WTVOU87nzQGGvUGVoGRA(6x zWCcc;Fn%eihpYbVk7U>@g^Xn zDWfnzt09L6Gm4O@XT4$(c^@=t zZzB;DYpWd_7#jLv!y+c`zd+QJaL*PMLD8g9P-SouILM|Hf18-#Z2Sz90nZXz-dJD% zp-qvkFN?`Q;7+5={)h~0J^M?6V{shM^`f@0+b8zd8Sm&jPOQ57o?Yqe@sGf*nwVcH zitbJfZc63DX(;7?@B55cS$w?vd9k^DjY->RA{95|RJa~$V;O*dy=UwH$BxW&=PP(w z=xJo~8L`SW7oKmRV+CrE=v}Awy#IDaHXF4~3~Q1VBS}Nx*mG$_nWH@MIHxx0Iy)a} zbzR+q>StaB3rGeEJd(tws#>va((W#pEvD_!J*ta5Y&(b)eDu*j_dvGjspo7d!YP1C z=+Aet@1__yAFY7>gicQv$|HeK7ADf0NLKaxJ=H!)*3H+XrEm_+X48Tg$!6Qg`swBd zpo6MdRxRIOTuaHyp7I4u$xzhKK=W+T5lP`u3x67HGhHkJFLM+)ec|OJaA4B(et*?Y z6ZV&N5iKnrf{;Z?u+wC|<4byBO2vsOe^h4h8j?)J$r6manlv0MdD64-TvD4D6ZU4I z@tsQY3I68jlj_SYfNe2kU#hN`_ipcxWi z1+*hZ+)mvZH?lTxFF#p8qYL9%gi;0xh;HOhFD$D0K|OjhVsCHHct!Cm@?h^Yh2#bl zr8RNI$HfVh<>hS%Ms!yur}8BUsIY~}`4u?xzUxJ48~3b&)YsZimqvBPo}8ZQia?Kg zk9cgC$e~C14SqE6FO`**7xHVmtq)FAwpl9zeRH^o7jNIbMTg(8NwQ+wzIlM~lBGbE z#@U8R>@n=@?b|ZfS42!TEhhMZxi$$hVQAb&l$4Yt6dUaFY%N;8d!f{3la!P+^Y!c3 zxvz?^9~-`=lng~7%|my39#meEmGxKbKCr&NULIwtUZ(taX4)zqq;F>zcRWuc;;&Xg zNr}XuwjZlkynPgA1o9PSB_%%Yy^*vRqv|Z-iZ)xIGQ{D6Z_d_1%x$etccE|RgNz@Powf)@=bGF;`}y*u|K!ptM44#b1w{rPvQ z2_hMlB2!7U`UVCfC;)sE7x)Ho!gzR`YcE$q=zaenAQtkX8FgR2d?DlF;&NsS|HgvZ z743^D&jNKu*(xqBZf4WONZ>SnnqWmGNrrL@E?HSwdyjcUX(I89CTAnlX`dyIJ{E{T*$Bmy4(2K0|>g)2@wf^eixSi8Eqe#;+<_G%LV3D8zrT1uCplqRA$xkZ8e z)cy42BmKDvFNNu?fe9=Zw47DS$*tnvk4) zy*9wp=1qxU1|mebgyGH6M75#W#1#& z`%mTn?r#q1zkL1bGiz5fg?brgd9Pm|U*(*6=pi&N4gt7m_jLaz4b24+5l?a!EkNz{ zJ5+d1VPRn}alwp(<_aK$6J3(VPEAdz1qB5SOI zQ6rVenX9&(gm+z`N5PnHuI@F#KeYsI!NFv~-Kk0!Q`32e`l)eLbS~bV4Hd9*GDsM(O}mqSfddlHo{>C4^wMwJ>{|zke9x)lvqyS*dfbhTjUTY4>AJ7B7KNYv(Rl1o zwIyGVEon$6{^2O|66u=HXm!*mI6{5mdj~pNAb|E_odi-$To*XE|DJk(!TNjqDqnr& z76U5$C;TwPe$$0GxYa#ziLsC4vwL^A#VkiDqJ|)=7e=|S-|o%#1_Qo}tbMN4aZz8? zIhh3*P?mSy=n+B_HhRS%aIFi99UUCRSzn?$YMKGV zFykn$mDX~8<@rbMHOJ#o(Hr8riLRq|Zj zxQ&N}O|D(@5e_<`Q-#q%7&6UnYKi(>pB*&OeW0r_0Jhh zCBljS{$w*4^t&|4Q5IrNR}H^0pKJ`&F%gJzvfyld@v{*X64Agv(xknnS|A)w(}%xw zFY1Q^;lz{HM4l!2PK`l%I+$ar=a(i$Mm3V{1cib+;_r4QTpLwzmhIArfARSzk9*aG zn>Dzt6H^`Uu|Muy;4m1tDg<#zqJJ;gj_#%VwAaQy({+tb%?mZ@KCxes*>a*t$s)&2 z)yzL#ZV$lt>m`XmiNyLW*p+NjwPoWW9D(0^BoqOyYo(X39!||DoT3@q_7END?_Xrx z5q6_eik97;Y_d%T#n;OL1ozqRJO3Rl+z6SPRg;f}j@m8$nBtZsO}C}s5eiFJ z1{$cDHX<2%ZL(D~ig!-dBCXd5%+{0*+(w3^e65U9?Iu@J{DY7p-Ci1xx~~-OXA-qJ z?d}9$EaIfn6^|WIY$D0`-CZBJvHkA)-7il_?>1W1-6_mSRS%HDz zvj9-l*PjeAf!R1aKYV}s>7sqoRqXp&ySm5WG{I_o;?>j>6M`hFkaU8g$V^IlIfqzv zj||5Oqx&C%J0k6M@itQF?)Pvz`d$<;A?<>Z8)0}j-{79#)Y~a6B$UnwTN^vup&P@* z+VcIpMLLELAy;v=C|?r=>#Iis!Q?ZM*aWP!>i-P2=ot?Twa@ASrVn{r&s*-2 zY^bfRJuH&GPfBH{{VVaKx3_sxEoS(DI~!eD|F2&kvukVr;dovnVhvurxIrJiqcW*h z&2C1Nmp+ZGA&p{`XSAtz3cPc@$s=S@*}b6U`t0w zM~dMzv5Wnt!`7Rb#gDJ>+9>ANRPpn0b{OS8~KCg zC~lP*T=!ynqp-r&E-3?-?izl>mVW7mq&FpA4Hg$yoZ>l=y9S6kx%sVDSm6@`A5EWp&->rqf80WX+-5O+9Ik7ip9*s(B^~?YYg}OX(XzuK0ekBOtsO^U+PmXBC zn*VV!YN1+md9G3R`4FcTLpx$){q`dXANu_m(EVemH%IEDbio9 d)^>W30_s%vqDt(cMo8xvs3>U4m&#gv{vVJ-$g}_e literal 0 HcmV?d00001 diff --git a/data/icon/myfile_thumbnail_icon_word.png b/data/icon/myfile_thumbnail_icon_word.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5b578a428da1750755bf8a495c0e9cf963fc9b GIT binary patch literal 10262 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 Ag#Z8m literal 0 HcmV?d00001 diff --git a/data/image/myfile_icon_shortcut_default_corner.png b/data/image/myfile_icon_shortcut_default_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1a8e32db2483ea130ec5982ec42f8130b3588a GIT binary patch literal 7177 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 literal 0 HcmV?d00001 diff --git a/data/myfile.edc b/data/myfile.edc new file mode 100644 index 0000000..ac5adfa --- /dev/null +++ b/data/myfile.edc @@ -0,0 +1,1825 @@ +#include "./edc_common.h" + +#define EFFECT_PROGRAMS(part_name, part_state, after_name) \ + program { \ + name: part_name; \ + action: STATE_SET part_state 0.0;\ + target: "icon"; \ + transition: DECELERATE 0.03; \ + after: after_name; \ + } + +#define EFFECT_PROGRAMS_MINIMAL(part_name, part_state, after_name) \ + program { \ + name: part_name; \ + action: STATE_SET part_state 0.0;\ + target: "icon"; \ + transition: DECELERATE 0.03; \ + after: after_name; \ + } +#define BEAT_POPUP_PART_BASE( param_item_width ,param_item_height ) \ + part { name: "base"; \ + type: RECT; \ + repeat_events: 1; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: param_item_width param_item_height; \ + color: 246 245 237 255; \ + } \ + } +#define BEAT_POPUP_PART_DISCLIP \ + part { name: "disclip"; \ + type: RECT; \ + scale: 1;\ + description { state: "default" 0.0; \ + rel1.to: "bg"; \ + rel2.to: "bg"; \ + } \ + description { state: "disabled" 0.0; \ + inherit: "default" 0.0; \ + color: 255 255 255 64; \ + } \ + } +#define BEAT_POPUP_PART_BG \ + part { name: "bg"; \ + type: RECT; \ + clip_to: "disclip"; \ + mouse_events: 0; \ + scale: 1;\ + description { state: "default" 0.0; \ + color: 246 245 237 255; \ + } \ + description { state: "hide" 0.0; \ + inherit: "default" 0.0; \ + rel1 { relative: -0.025 0.0; } \ + rel2 { relative: 0.975 1.0; } \ + } \ + description { state: "hide" 0.1; \ + inherit: "default" 0.0; \ + rel1 { relative: -0.13 0.0; } \ + rel2 { relative: 0.87 1.0; } \ + } \ + description { state: "hide" 0.2; \ + inherit: "default" 0.0; \ + rel1 { relative: -0.5 0.0; } \ + rel2 { relative: 0.5 1.0; } \ + } \ + description { state: "hide" 0.3; \ + inherit: "default" 0.0; \ + rel1 { relative: -1.0 0.0; } \ + rel2 { relative: 0.0 1.0; } \ + } \ + } + +#define MF_PART_PADDING_TOP( param_padding_size ) \ + part { name: "elm.padding.top"; \ + type: RECT; \ + scale: 1; \ + description { \ + state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel2.relative: 1.0 0.0; \ + align: 0.0 0.0; \ + } \ + } +#define MF_PART_PADDING_BOTTOM( param_padding_size ) \ + part { name: "elm.padding.bottom"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: 0 param_padding_size; \ + fixed: 0 1; \ + visible: 0; \ + rel1.relative: 0.0 1.0; \ + align: 0.0 1.0; \ + } \ + } + +#define MF_PART_PADDING_LEFT( param_padding_size ) \ + part { name: "elm.padding.left"; \ + type: RECT; \ + scale: 1; \ + description { state: "default" 0.0; \ + min: param_padding_size 0; \ + fixed: 1 0; \ + visible: 0; \ + rel2.relative: 0.0 1.0; \ + align: 0.0 0.0; \ + } \ + } + + + +images { + + image, "myfile_icon_shortcut_default_corner.png" COMP; + +} + +collections { + + /** fore genlist normal_item feature icon**/ + + + group { + name: "noContent"; + + parts { + part { + name: "myfile.noContent.upper"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 0.0; offset: 0 90;} + } + } + part { + name: "myfile.noContent.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 1.0; + offset: 0 0; + to_y: "myfile.noContent.upper"; + } + rel2 { relative: 1.0 1.0;} + + } + } + + } + } + /* for genlist multi_item style*/ + group + { + name:"thumbnail_only"; + min: 50 50; + max: 50 50; + parts + { + part + { + name:"thumbnail"; + type:SWALLOW; + scale: 1; + description + { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + part + { + name:"video_play"; + type:SWALLOW; + scale: 1; + description + { + state: "default" 0.0; + rel1 { to:"thumbnail"; } + rel2 { to:"thumbnail"; } + } + } + part + { + name: "myfile.memory_icon_multi.sub"; + type: SWALLOW; + scale: 1; + description + { + state: "default" 0.0; + fixed: 1 1; + max : 20 25; + min : 20 25; + rel1 { relative:0.5 0.5; to:"thumbnail";} + rel2 { relative:1.0 1.0; to:"thumbnail";} + } + } + } + } + + + + /************** 5 myfiles shortcut images ****************/ + group { + name, "myfile_shortcut_5_images"; + + parts { + part + { + name:"bg"; + type:IMAGE; + scale: 1; + description + { + state: "default" 0.0; + min:680 96; + max:680 96; + fixed:1 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + image { + normal, "myfile_icon_shortcut_default_corner.png"; + border, 47 47 0 0; + } + } + } + + part { + name, "mf_shortcut_image"; + type, SWALLOW; + scale: 1; + mouse_events, 1; + description + { + state, "default" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, SHORTCUT_IMG_ORI/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, SHORTCUT_IMG_ORI/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + } + description + { + state, "clicked" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, SHORTCUT_IMG_ORI/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, SHORTCUT_IMG_ORI/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + } + } + + part { + name, "mf_shortcut_video"; + type, SWALLOW; + scale: 1; + mouse_events, 1; + description + { + state, "default" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + } + description + { + state, "clicked" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + } + } + + part { + name, "mf_shortcut_sound"; + type, SWALLOW; + scale: 1; + mouse_events, 1; + description + { + state, "default" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + description + { + state, "clicked" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0.5 0.5; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + } + + part { + name, "mf_shortcut_document"; + type, SWALLOW; + scale: 1; + mouse_events, 1; + description + { + state, "default" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + description + { + state, "clicked" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0.5 0.5; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + } + + part { + name, "mf_shortcut_others"; + type, SWALLOW; + scale: 1; + mouse_events, 1; + description + { + state, "default" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+4*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+4*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + description + { + state, "clicked" 0.0; + min, 72 72; + max, 72 72; + fixed:1 1; + align, 0.5 0.5; + align, 0 0; + rel1 { + relative, (SHORTCUT_IMG_ORI+4*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_IMG_ORI+4*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_IMG_ORI_Y/SHORTCUT_H; + } + + } + } + + + part { + name, "mf_shortcut_1st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + color, 185 184 174 255; + align, 0 0; + rel1 { + relative, SHORTCUT_BLINE/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, SHORTCUT_BLINE/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_3st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + color, 185 184 174 255; + align, 0 0; + rel1 { + relative, (SHORTCUT_BLINE+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_BLINE+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_5st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + color, 185 184 174 255; + align, 0 0; + rel1 { + relative, (SHORTCUT_BLINE+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_BLINE+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_7st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + color, 185 184 174 255; + align, 0 0; + rel1 { + relative, (SHORTCUT_BLINE+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_BLINE+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_2st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + align, 0 0; + color, 255 255 255 255; + + rel1 { + relative, SHORTCUT_WLINE/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, SHORTCUT_WLINE/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_4st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + align, 0 0; + color, 255 255 255 255; + + rel1 { + relative, (SHORTCUT_WLINE+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_WLINE+SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_6st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + align, 0 0; + color, 255 255 255 255; + + rel1 { + relative, (SHORTCUT_WLINE+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_WLINE+2*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + part { + name, "mf_shortcut_8st_vLine"; + type, RECT; + scale: 1; + mouse_events, 0; + description + { + state, "default" 0.0; + min, 1 50; + max, 1 50; + fixed:1 1; + align, 0 0; + color, 255 255 255 255; + + rel1 { + relative, (SHORTCUT_WLINE+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + + rel2 { + relative, (SHORTCUT_WLINE+3*SHORTCUT_ADD)/SHORTCUT_W SHORTCUT_Y/SHORTCUT_H; + } + } + } + } + + programs { + program { + name, "button_click"; + signal, "mouse,clicked,1"; + source, "*"; + action, STATE_SET "clicked" 0.0; + target, "mf_shortcut_document"; + } + } +} + + + + /************** progressbar popup****************/ + group { name: "popup_center_progressview"; + parts{ + part { name: "elm.title"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + max: 200 70; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 42; + min: 0 0; + align: 0.5 0.5; + } + color: 108 108 108 255; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.15; + //to: "elm.swallow.content"; + } + rel2 { + relative: 1.0 0.0; + //to: "elm.swallow.content"; + } + } + } + part{ name:"elm.swallow.content"; + type: SWALLOW; + scale : 1; + description { state: "default" 0.0; + min: 0 128; + align: 0.5 0.5; + fixed: 1 0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part { name: "elm.text.left"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + max: 150 26; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 26; + min: 0 0; + align: 0.0 1.0; + } + color: 108 108 108 255; + align: 0.0 1.0; + rel1 { + relative: 0.0 0.0; + to: "elm.swallow.content"; + } + rel2 { + relative: 1.0 1.0; + to: "elm.swallow.content"; + } + } + } + part { name: "elm.text.right"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + max: 150 26; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 26; + min: 0 0; + align: 1.0 1.0; + } + color: 108 108 108 255; + align: 1.0 1.0; + rel1 { + relative: 0.0 0.0; + to: "elm.swallow.content"; + } + rel2 { + relative: 1.0 1.0; + to: "elm.swallow.content"; + } + } + } + } + } + + group { + name: "effect/model/list"; + parts { + part + { + name: "icon"; + type: RECT; + mouse_events: 0; + scale: 1; + description + { + state: "default" 0.0; + max : THUMBNAIL_W THUMBNAIL_H; + fixed: 1 1; + align: 0.5 0.5; + aspect: 1.0 1.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + color: 0 0 0 255; + } + description + { + state: "min" 0.0; + inherit: "default" 0.0; + max: 0 0; + } + description + { + state: "level1" 0.0; + inherit: "default" 0.0; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 1.0; + } + } + } + + part { + name: "swallow_thumb"; + type: SWALLOW; + mouse_events: 0; + + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { + to: "icon"; + } + rel2 { + to: "icon"; + } + } + } + part { + name: "myfile.memory_icon.sub"; + type: SWALLOW; + + scale: 1; + description{ + state: "default" 0.0; + max : MEMORY_SUB_THUMB_W MEMORY_SUB_THUMB_H; + min : MEMORY_SUB_THUMB_W MEMORY_SUB_THUMB_H; + fixed: 1 1; + rel1 { relative:0.5 0.5; to:"icon";} + rel2 { relative:1.0 1.0;to:"icon";} + } + } + } + + programs { + program { + name: "effect_gen"; + signal: "effect.gen"; + source: "thumb"; + action: STATE_SET "min" 0.0; + target: "icon"; + after: "thumb_gen_1"; + } + EFFECT_PROGRAMS("thumb_gen_1", "level1", "thumb_gen_2"); + program { + name: "thumb_gen_2"; + action: STATE_SET "default" 0.0; + target: "icon"; + transition: SINUSOIDAL 0.1; + } + } + } + + group + { + name: "pathinfo"; + parts { + part + { + name: "base"; + type: RECT; + repeat_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 0 PATH_INFO_H; + fixed:0 1; + color: PATH_INFO_BG_COLOR; + } + } + part + { + name: "bg"; + type: RECT; + //clip_to: "disclip"; + repeat_events: 0; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + color: PATH_INFO_BG_COLOR; + } + } + MF_PART_PADDING_TOP(0) + MF_PART_PADDING_BOTTOM( 0 ) + MF_PART_PADDING_LEFT( 10 ) + part { name: "info"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.5; + rel1 + { + relative: 1.0 0.0; + to_x: "elm.padding.left"; + } + rel2 + { + relative: 1.0 1.0; + to_y: "elm.padding.bottom"; + } + color: 255 255 255 255; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 32; + min: 1 1; + align: 0.0 0.5; + } + } + } + } + } + group + { + name:"upper_folder"; + parts + { + + part + { + name: "base"; + type: RECT; + repeat_events: 0; + scale: 1; + description { + state: "default" 0.0; + color: 215 225 232 255; + } + } + part { name: "home"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + rel1.relative: 0.022 0.157; + rel2.relative: 0.489 0.843; + } + } + part { name: "upper"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + rel1.relative: 0.511 0.157; + rel2.relative: 0.978 0.843; + } + } + + } + } + + group + { + name: "pathinfo_lanscape"; + parts { + part + { + name: "base"; + type: RECT; + repeat_events: 0; + scale: 1; + description { + state: "default" 0.0; + color: 200 200 200 127; + } + } + part + { + name: "bg"; + type: RECT; + clip_to: "disclip"; + scale: 1; + description { + state: "default" 0.0; + color: 200 200 200 127; + } + } + MF_PART_PADDING_TOP(0) + MF_PART_PADDING_BOTTOM( 0 ) + MF_PART_PADDING_LEFT( 10 ) + part + { + name: "bottom_line"; + type: RECT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + min: 0 1; + fixed: 0 1; + visible: 1; + color: 199 199 199 255; + rel1 + { + relative: 0.0 1.0; + offset: 0 -1; + } + } + } + part + { + name: "info"; + clip_to: "disclip"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + min: 0 52; + // max: 0 52; + fixed: 1 1; + align: 0.0 0.5; + rel1 + { + relative: 1.0 1.0; + offset: 0 0; + to_x: "elm.padding.left"; + to_y: "elm.padding.top"; + } + rel2 + { + relative: 1.0 0.0; + offset: 0 0; + to_x: "elm.padding.left"; + to_y: "elm.padding.bottom"; + } + } + } + + part + { + name: "disclip"; + type: RECT; + scale: 1; + description + { + state: "default" 0.0; + } + } + } + } + group + { + name:"upper_folder_lanscape"; + parts + { + part + { + name: "upper"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 1.0; + } + align: 0.5 0.5; + } + } + } + } + + + group + { + name:"bottom_layout"; + parts + { + part + { + name: "upper"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 320 75; + // max: 320 75; + fixed:1 1; + visible:1; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 0.16; + } + align: 0.5 0.5; + } + description { + state: "hide" 0.0; + min: 0 0; + // max: 0 0; + fixed:1 1; + visible:0; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 0.0 0.0; + } + } + } + part + { + name: "genlist_layout"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible:1; + rel1 + { + relative: 0.0 1.0; + to:"upper"; + } + rel2 + { + relative: 1.0 1.0; + } + align: 0.5 0.5; + } + } + } + programs + { + program { + name: "hide_upper"; + source: "elm"; + signal: "upper.hide"; + action: STATE_SET "hide" 0.0; + target: "upper"; + } + program { + name: "show_upper"; + source: "elm"; + signal: "upper.show"; + action: STATE_SET "default" 0.0; + target: "upper"; + } + + } + } + group + { + name:"left_layout"; + parts + { + part + { + name: "path_info"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 320 52; + // max: 320 52; + fixed:1 1; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 0.11; + } + align: 0.5 0.5; + } + } + part + { + name: "select_all"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 320 52; + // max: 320 52; + fixed:1 1; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 0.11; + } + align: 0.5 0.5; + } + } + part + { + name: "bottom"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 320 428; + // max: 320 428; + fixed:1 1; + rel1 + { + relative: 0.0 1.0; + to_y:"path_info"; + } + rel2 + { + relative: 1.0 1.0; + } + align: 0.5 0.5; + } + } + } + } + + group { + name: "search_view"; + + parts { + part { + name : "result"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + min: 450 0; + fixed:1 0; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + + } + + } + + } + + group + { + name: "landscape_layout"; + + parts + { + part + { + name: "path_info"; + mouse_events: 1; + type: SWALLOW; + scale: 1; + description + { + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 0.07;} + } + } + part + { + name: "panes"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description + { + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 1.0; to_y: "path_info";} + rel2 { relative: 1.0 1.0; } + } + } + + } + } + + group { name: "new_folder_layout"; + parts { + part { name: "inputfield_rect"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: 0 SEARCHBAR_HEIGHT_INC; + fixed: 0 1; + align: 0.0 0.0; + color: 248 246 239 255; + } + } + part { name: "left_icon_padding_rect"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 0; + min: SEARCHBAR_LEFT_ICON_PADDING_INC 0; + fixed: 1 0; + align: 0 0; + rel1.to: "inputfield_rect"; + rel2 { + relative: 0.0 1.0; + to: "inputfield_rect"; + } + } + } + part { name: "left_padding_search_textfield"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 0; + min: SEARCHBAR_LEFT_PADDING_SEARCHFIELD_INC 0; + fixed: 1 0; + align: 0.0 0.5; + rel1 { + relative: 0.0 0.0; + to_y: "inputfield_rect"; + } + rel2 { + relative: 0.0 1.0; + to_y: "inputfield_rect"; + } + } + } + part { name: "right_padding_search_textfield"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 0; + min: SEARCHBAR_RIGHT_PADDING_SEARCHFIELD_INC 0; + fixed: 1 0; + align: 1.0 0.5; + rel1 { + relative: 1.0 0.0; + to: "inputfield_rect"; + } + rel2 { + relative: 1.0 1.0; + to: "inputfield_rect"; + } + } + } + part { name: "search_textfield"; + type: RECT; + mouse_events: 1; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + color: 0 0 0 0; + min: 0 SEARCHBAR_SEARCH_TEXTFIELD_H_INC; + fixed: 0 1; + align: 0.0 0.5; + rel1 { + relative: 1.0 0.0; + to: "left_padding_search_textfield"; + } + rel2 { + relative: 0.0 1.0; + to: "right_padding_search_textfield"; + } + } + } + part { name: "top1"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: 0 EDITFIELD_SEARCHBAR_TOP1_SINGLE_INC; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to: "search_textfield"; + } + rel2 { + relative: 1.0 0.0; + to: "search_textfield"; + } + align: 0.5 0; + } + } + part { name: "top2"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: 0 EDITFIELD_SEARCHBAR_TOP2_INC; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to: "search_textfield"; + } + rel2 { + relative: 1.0 0.0; + to: "search_textfield"; + } + align: 0.5 0; + } + } + part { name: "left1"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: EDITFIELD_SEARCHBAR_LEFT1_INC 0; + fixed: 1 1; + align: 0 0; + rel1 { + relative: 0.0 0.0; + to: "search_textfield"; + } + rel2 { + relative: 0.0 1.0; + to: "search_textfield"; + } + } + } + part { name: "left2"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: EDITFIELD_SEARCHBAR_LEFT2_INC 0; + fixed: 1 1; + align: 0 0; + rel1 { + relative: 0.0 0.0; + to: "search_textfield"; + } + rel2 { + relative: 0.0 1.0; + to: "search_textfield"; + } + } + } + part { name: "right1"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: EDITFIELD_SEARCHBAR_RIGHT1_ERASER_SHOW_INC 0; + fixed: 1 1; + align: 1 0; + rel1 { + relative: 1.0 0.0; + to: "search_textfield"; + } + rel2.to: "search_textfield"; + } + } + part { name: "right2"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: EDITFIELD_SEARCHBAR_RIGHT2_INC 0; + fixed: 1 1; + align: 1 0; + rel1 { + relative: 1.0 0.0; + to: "search_textfield"; + } + rel2.to: "search_textfield"; + } + } + part { name: "bottom1"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: 0 EDITFIELD_SEARCHBAR_BOTTOM1_SINGLE_INC; + fixed: 1 1; + align: 0 1; + rel1 { + relative: 0.0 1.0; + to: "search_textfield"; + } + } + } + part { name: "bottom2"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: 0 EDITFIELD_SEARCHBAR_BOTTOM2_SINGLE_INC; + fixed: 0 1; + rel1 { + relative: 0.0 1.0; + to: "search_textfield"; + } + align: 0 1; + } + } + part { name: "bottom3"; + type: RECT; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + visible: 0; + min: 0 EDITFIELD_SEARCHBAR_BOTTOM3_SINGLE_INC; + fixed: 0 1; + rel1 { + relative: 0.0 1.0; + to: "search_textfield"; + } + align: 0 1; + } + } + part { name: "top_line"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + min: 0 1; + fixed: 0 1; + rel1 { + relative : 0.0 0.0; + } + rel2 { + relative : 1.0 0.0; + } + color:169 169 169 255; + } + } + part { + name: "content"; + type: SWALLOW; + scale: 1; + ignore_flags: ON_HOLD; + description { state: "default" 0.0; + min: 0 40; + // max: 0 140; + rel1 { + relative : 1.0 1.0; + to_x: "left1"; + to_y: "top1"; + } + rel2 { + relative : 0.0 0.0; + to_x: "right1"; + to_y: "bottom1"; + } + align: 0.0 0.5; + } + } + part { name: "bottom_line"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + min: 0 1; + fixed: 0 1; + rel1 { + relative : 0.0 1.0; + to_y:"content"; + } + rel2 { + relative : 1.0 1.0; + to_y:"content"; + } + color:169 169 169 255; + } + } + } + } + group { + name: "PAD"; + + parts { + part { + name: "content"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + color: 248 246 239 255; + } + } + } + } + group { name: "selectinfo_layout"; + parts { + part { name: "background"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 248 246 239 255; + } + } + part { + name: "content"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + + part { + name: "sel_contents"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + to:"content"; + } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "swallow.shortcut"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + min: MAIN_W 96; + max: MAIN_W 96; + fixed: 1 1; + rel1 { + relative: 0.0 1.0; + } + color: 0 0 0 255; + align: 0.5 1.0; + } + } + } + programs { + program { + name: "show"; + signal: "show,selection,info"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "sel_contents"; + } + program { + name: "hide"; + signal: "hide,selection,info"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "sel_contents"; + } + } + } + group { + name: "apptray.item"; + + parts { + //MF_PART_PADDING_TOP(24 ) + //MF_PART_PADDING_BOTTOM(24) + part{ + name: "background"; + type: RECT; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + min: 72 72; + max: 72 72; + fixed:1 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 0 0 0 255; + visible: 0; + } + } + + part{ + name: "swallow.icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description{ + state: "default" 0.0; + //min: 96 96; + min: 72 72; + max: 72 72; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to: "background"; + } + rel2 { + relative: 1.0 1.0; + to: "background"; + } + align: 0.5 0.5; + } + } + } +} + group + { + name: "search_path"; + parts { + part + { + name: "path"; + type: SWALLOW; + scale: 1; + description + { + state: "default" 0.0; + fixed: 1 1; + min : MF_SEARCH_FOLDER_W MF_SEARCH_FOLDER_H; + max : MF_SEARCH_FOLDER_W MF_SEARCH_FOLDER_H; + align: 0.5 0.5; + rel1 + { + relative: 0.0 0.0; + } + rel2 + { + relative: 1.0 1.0; + } + } + } + } + } + group { name: "search_view_layout"; + parts { + part { name: "background"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 248 246 239 255; + } + } + part { + name: "search_bar"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 SEARCHBAR_H_INC; + fixed: 0 1; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 0.0;} + } + } + part { + name: "content"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { state: "default" 0.0; + align: 0.5 0.0; + rel1 { relative: 0.0 1.0; to_y:"search_bar";} + rel2 { relative: 1.0 1.0;} + } + } + + part { + name: "sel_contents"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 0 1; + align: 0.5 1.0; + rel1 { + relative: 0.0 1.0; + to:"content"; + } + } + description { state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "show"; + signal: "show,selection,info"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "sel_contents"; + } + program { + name: "hide"; + signal: "hide,selection,info"; + source: "elm"; + action: STATE_SET "hide" 0.0; + target: "sel_contents"; + } + } + } + + +group { name: "popup_center_text"; + parts{ + part { name: "elm.title"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + max: 240 60; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 42; + min: 0 0; + align: 0.5 0.5; + } + color: 0 0 0 255; + align: 0.5 0.0; + rel1 { + relative: 0.0 0.25; + } + rel2 { + relative: 1.0 0.0; + } + } + } + part{ name:"elm.swallow.content"; + type: TEXT; + scale : 1; + description { state: "default" 0.0; + min: 0 118; + fixed: 1 0; + text { + font: FONT_NANE; + text_class:"tizen"; + size: 42; + min: 0 0; + align: 0.5 0.5; + } + color: 0 0 0 255; + align: 0.5 0.0; + rel1 { + relative: 0.0 1.0; to_y: "elm.title"; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } +} diff --git a/data/po/CMakeLists.txt b/data/po/CMakeLists.txt new file mode 100644 index 0000000..e9cc98d --- /dev/null +++ b/data/po/CMakeLists.txt @@ -0,0 +1,26 @@ +# for i18n + +SET(POFILES bg.po cs.po el_GR.po en_US.po et.po fr_CA.po gl.po hu.po it_IT.po kk.po +lv.po nb.po ro.po sl.po tr_TR.po uz.po zh_SG.po az.po de_DE.po en.po es_US.po +es_MX.po fi.po ga.po hr.po is.po ka.po lt.po pl.po pt_PT.po sk.po sv.po zh_HK.po ar.po ca.po da.po en_PH.po es_ES.po eu.po fr_FR.po hi.po hy.po ja_JP.po ko_KR.po mk.po nl_NL.po pt_BR.po ru_RU.po sr.po uk.po zh_CN.po zh_TW.po) + +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/data/po/POTFILES.in b/data/po/POTFILES.in new file mode 100644 index 0000000..d2ad8bd --- /dev/null +++ b/data/po/POTFILES.in @@ -0,0 +1,14 @@ +# List of source files containing translatable strings. +applications/myfile.c +applications/myfileCallBack.c +applications/myfileUtil.c +libraries/platform-wrapper/myfile_filemanagerservice_wrapper.c +libraries/platform-wrapper/myfile_setting_wrapper.c +libraries/winset-wrapper/myfileContent.c +libraries/winset-wrapper/myfileContextPopup.c +libraries/winset-wrapper/myfileControlBar.c +libraries/winset-wrapper/myfileInput.c +libraries/winset-wrapper/myfileLayout.c +libraries/winset-wrapper/myfileListView.c +libraries/winset-wrapper/myfileNavigationBar.c +libraries/winset-wrapper/myfilePopup.c diff --git a/data/po/ar.po b/data/po/ar.po new file mode 100644 index 0000000..0c4b016 --- /dev/null +++ b/data/po/ar.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "لأعلى" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "الرئيسية" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "عرض عبر اللائحة" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "عرض عبر المختصرات" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "فشل المسح" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "ملف DRM. يتعذر الإرسال" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "اسم الملف غير صالح" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "تجاوز الحد الأقصى لعدد المجلدات" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "تم رفض الإذن" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "فشل الإرسال" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "مجلد الوجهة هو مجلد فرعي من مجلد المصدر" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "هذا الملف غير موجود" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "يتعذر النسخ" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "يتعذر النقل" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "لا توجد مساحة كافية بذاكرة الهاتف. احذف بعض العناصر وحاول مرة أخرى" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "فشل النسخ" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "فشل النقل" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "الذاكرة لا تكفي. متوفر %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "نفس الاسم مستخدم مسبقا" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "يتعذر النقل. المجلد الوجهة نفس المجلد المصدر" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "إنشاء مجلد" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "لصق هنا" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "تنبيهات" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "خلفيات الشاشة" + +msgid "IDS_MF_TAB_PHONE" +msgstr "الهاتف" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "الصور" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "الفيديو" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "الأصوات" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "ملفات محملة" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "بطاقة الذاكرة" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "‏‫التخزين الخارجي" + +msgid "IDS_MF_SK3_EDIT" +msgstr "تعديل" + +msgid "IDS_MF_SK3_DELETE" +msgstr "مسح" + +msgid "IDS_MF_SK3_MOVE" +msgstr "نقل" + +msgid "IDS_MF_BODY_UP" +msgstr "أعلى" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "نقل إلى هنا" + +msgid "IDS_MF_SK3_COPY" +msgstr "نسخ" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "فرز حسب" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "بحث" + +msgid "IDS_MF_SK3_MORE" +msgstr "المزيد" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "إنشاء مجلد" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "اسم المجلد" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "ألبومي" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "عرض ﻜ" + +msgid "IDS_MF_SK3_BACK" +msgstr "رجوع" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "مشاهد الفيديو الخاصة" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "حالة الحقوق" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "التاجر" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "العدد" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "يحتوي على" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "فردي" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "الفترة" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "إعادة تسمية" + +msgid "IDS_MF_BODY_TIME" +msgstr "التوقيت" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "عداد محدد زمنيا" + +msgid "IDS_MF_BODY_TYPE" +msgstr "النوع" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "غير محدود" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "استبدال" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "نغمة رنين المتصل" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "الاسم" + +msgid "IDS_MF_POP_COPIED" +msgstr "تم النسخ" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "لا شيء محدد" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "الذاكرة لا تكفي" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "لا يوجد ذاكرة كافية. امسح بعض العناصر" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "تاريخ الإنشاء" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "معلومات GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "خط عرض GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "خط طول GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "إصدار GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "التفاصيل" + +msgid "IDS_MF_BODY_ANY" +msgstr "أي" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "الاستخدامات المتوفرة" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "تنفيذ" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "التحويل" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "غير ممكن" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "يتم الآن تهيئة بيانات MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "ممكن" + +msgid "IDS_MF_BODY_PRINT" +msgstr "طباعة" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "الصلاحية" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "مجلد جديد" + +msgid "IDS_MF_OPT_EDIT" +msgstr "تعديل" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "فرز بواسطة" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "نقل إلى هنا" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "متابعة" + +msgid "IDS_MF_POP_COPYING" +msgstr "جاري النسخ..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "لصق هنا" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "نوع ملف غير مدعوم" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "عرض مفصل" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "تصاعديا" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "تنازليا" + +msgid "IDS_MF_TAB_ALL" +msgstr "الكل" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "بحث في جميع المجلدات" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "عرض مختصر" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "إظهار امتداد الملفات" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "فرز بواسطة" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "القائمة والتفاصيل" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "اسم المجلد موجود مسبقا" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "إخفاء امتداد الملفات" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "الاسم (من Ø£ إلى ي)‬" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "الاسم (من ي إلى Ø£)‬" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "التاريخ (الأحدث)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "التاريخ (الأقدم)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "ذهاب إلى ملفاتي" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "نغمات الرنين" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "لم يتم اكتشاف وجه" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "إضافة للرئيسية" + diff --git a/data/po/az.po b/data/po/az.po new file mode 100644 index 0000000..989e3f1 --- /dev/null +++ b/data/po/az.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Yuxarı" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Ev" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Siyahı ilə görüntülə" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Miniatur goruntusu ile gozden kecir" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Silmək mümkün olmadı" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM faylı. Göndərmək mümkün deyil" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Yanlış fayl adı" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maksimum qovluq sayına çatıldı" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Ä°cazə rədd edildi" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Göndərmə alınmadı" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Təyin edilmiş yer üçün qovluq mənbə qovluğunun alt qovluğudur" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Bu fayl mövcud deyil" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Surətini köçürmək mümkün deyildir" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Yerini dəyişdirmək mümkün deyil" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Telefon yaddaşında kifayət qədər yaddaş yoxdur. Bəzi elementləri silin və yenidən cəhd edin" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Köçürülmə baş tutmadı" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Keçmə alınmadı" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Yaddaş yetərsizdir. %s yerləşdirmək mümkündür" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Eyni ad hazırda istifadə edilir" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr " Yerini dəyişmək mümkün deyildir. Hədəf qovluq mənbə qovluğu ilə eynidir" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Qovluq yaradın" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Buraya yapışdırın" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Siqnallar" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Divar kağızları" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Təsvirlər" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Səslər" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Yükləmələr" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Yaddaş kartı" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Xarici yaddaş" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Redaktə et" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Sil" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Apar" + +msgid "IDS_MF_BODY_UP" +msgstr "Yuxarı" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Buraya keçin" + +msgid "IDS_MF_SK3_COPY" +msgstr "Köçür" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Nizamla" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Axtar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Daha çox" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Qovluq yarat" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Qovluğun adı" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mənim albomum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "...kimi nəzərdən keçir" + +msgid "IDS_MF_SK3_BACK" +msgstr "Geriyə" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mənim səsli kliplərim" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Düzgün status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Tədarükçü" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Say" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Tərkibi" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Fərdi" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Ä°nterval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Ad.dyş" + +msgid "IDS_MF_BODY_TIME" +msgstr "Vaxt" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Məhdud say" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tip" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Limitsiz" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Əvəz et" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Zəng egənin zəng tonu" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Ad" + +msgid "IDS_MF_POP_COPIED" +msgstr "Surəti saxlanıldı" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "He nə seçilməmişdir" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Hip yaddaşda kifayət qədər yer yoxdur" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Yaddaş kifayət etmir. Xahiş olunur bəzi elementləri silin" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Yaradılmış tarix" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS məlumatı" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS en dairəsi" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS uzunluq dairəsi" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS versiyası" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Təfsilatlar" + +msgid "IDS_MF_BODY_ANY" +msgstr "Hər hansı" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Ä°stifadəsi mümkün olanlar" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Ä°cra et" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Göndərilir" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Mümkün deyil" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC məlumatı başladılır..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mümkündür" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Çap et" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Etibarlılıq" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Yeni qovluq" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Redaktə et" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sıralama qaydası" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Buraya keç" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Davam et" + +msgid "IDS_MF_POP_COPYING" +msgstr "Köçürülmə..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Buraya yapışdır" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Dəstəklənməyən fayl tipi" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Təfərrüat görünüşü" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Çoxalan" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Azalan" + +msgid "IDS_MF_TAB_ALL" +msgstr "Hamısını" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Bütün qovluqları axtar" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatür görüntüsü" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Fayl genişlənməsini göstər" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sıralama qaydası" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Siyahı və təfərrüatlar" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Qovluq adı hazırda mövcuddur" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Fayl uzantısını gizlət" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Ad (A-dan Z-yə)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Ad (Z-dən A-ya)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Tarix (Ən son)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Tarix (Ən köhnə)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Fayllarıma daxil ol" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Zəng tonu" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Üz göstərilmir" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Başl-a əlavə et" + diff --git a/data/po/bg.po b/data/po/bg.po new file mode 100644 index 0000000..b3aadce --- /dev/null +++ b/data/po/bg.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Нагоре" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Начало" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Изглед в списък" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Изглед с миниатюри" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Неуспешно изтриване" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM файл. Не може да се изпрати" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Невалидно име на файл" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Максималният брой папки достигнат" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Отказано разрешение" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Неуспешно изпращане" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Папката – назначение е подпапка на папката - източник" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Файлът не съществува" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Не може да се копира" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Не може да се премести" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Няма достатъчно памет в паметта на телефона. Изтрийте някои елементи и опитайте отново" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Копиране неуспешно" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Неуспешно преместване" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Няма достатъчно памет. %s свободни" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Такова име вече се използва" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Не може да се премести. Папката – назначение е същата като папката - източник" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Създай папка" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Постави тук" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Автоматичен запис" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Тапети" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Телефон" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Изображения" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Видеоклипове" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Звуци" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Изтеглени файлове" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Карта с памет" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Външна памет за съхр." + +msgid "IDS_MF_SK3_EDIT" +msgstr "Редактиране" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Изтрий" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Мести" + +msgid "IDS_MF_BODY_UP" +msgstr "Нагоре" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Преместване тук" + +msgid "IDS_MF_SK3_COPY" +msgstr "Копирай" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Сортирай по" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Търсене" + +msgid "IDS_MF_SK3_MORE" +msgstr "Още" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Създаване на папка" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Име на папка" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Моят албум" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Виж като" + +msgid "IDS_MF_SK3_BACK" +msgstr "НАЗАД" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Моите видеоклипове" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Състояние на правата" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Доставчик" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Броене" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Съдържа" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Индивидуален" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Интервал" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Преим." + +msgid "IDS_MF_BODY_TIME" +msgstr "Час" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Отброяване по време" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Тип" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Неограничен" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Замени" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Тон за звънене за повикващ" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Име" + +msgid "IDS_MF_POP_COPIED" +msgstr "Копирано" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Нищо не е избрано" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Няма достатъчно динамична памет" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Няма достатъчно памет. Изтрийте някои елементи" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Дата на създаване" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Данни от GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Географска ширина от GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Географска дължина от GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS версия" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Детайли" + +msgid "IDS_MF_BODY_ANY" +msgstr "Всеки" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Налични употреби" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Изпълни" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Препращане" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Невъзможно" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC данните се инициализират..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Lъзможно" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Отпечатаване" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Валидност" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ръчно" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Редактиране" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Подреждане по" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Преместване тук" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Продължи" + +msgid "IDS_MF_POP_COPYING" +msgstr "Копиране..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Постави тук" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Неподдържан тип файл" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Подробен изглед" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Във възходящ ред" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "В низходящ ред" + +msgid "IDS_MF_TAB_ALL" +msgstr "Всички" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Търс. във всички папки" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Екран миниатюри" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Покажи разширението на файл" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Сортиране по" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Списък и подробни данни" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Името на папка вече същест- вува" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Скрий разшир. на файл" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Име (A до Я)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Име (Я до А)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Дата (най-нови)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Дата (най-стари)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Отиди Моите файлове" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Мелодии" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Не е разпознато лице" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Доб. към нач." + diff --git a/data/po/ca.po b/data/po/ca.po new file mode 100644 index 0000000..53ac051 --- /dev/null +++ b/data/po/ca.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Amunt" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Pers." + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Veure per llista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Veure per miniatura" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Error en esborrar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Arxiu DRM. No es pot enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nom de fitxer no vàlid" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "S'ha assolit el nombre màxim de carpetes" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permís denegat" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Error en enviar" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "La carpeta de destinació és una subcarpeta de la d'origen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Aquest fitxer no existeix" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "No es pot copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "No es pot moure" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "No hi ha prou espai a la memòria del telèfon. Esborri'n alguns elements i torni-ho a intentar" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Error en copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Error en moure" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "No hi ha prou memòria. %s disponible" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "El mateix nom ja està en ús" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "No es pot moure. La carpeta de destinació és la mateixa que la d'origen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Enganxar aquí" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Avisos" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fons de pantalla" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telèfon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imatges" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descàrregues" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Targeta memòria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Emmagatzematge extern" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Esborrar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Moure" + +msgid "IDS_MF_BODY_UP" +msgstr "Amunt" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Moure aquí" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar per" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Cercar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Més" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nom carpeta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "El meu àlbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Veure com a" + +msgid "IDS_MF_SK3_BACK" +msgstr "Enrere" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Els meus videoclips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estat correcte" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Proveïdor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Comptatge" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Conté" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Reanom" + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Compte contrarellotge" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipus" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Il·limitat" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Substit" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Melodia de la persona que truca" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nom" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiat" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "No s'ha seleccionat res" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "No hi ha prou memòria dinàmica" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "No hi ha prou memòria. Esborrar-ne alguns elements" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Data de creació" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informació de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitud GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitud GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versió GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalls" + +msgid "IDS_MF_BODY_ANY" +msgstr "Qualsevol" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usos disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Executar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reenviant" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "No és possible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "S'estan inicialitzant les dades MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validesa" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Carpeta nova" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Llistar per" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Moure aquí" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiant..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Enganxar aquí" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "No s'admet el tipus de fitxer" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista de detall" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendent" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendent" + +msgid "IDS_MF_TAB_ALL" +msgstr "Tot" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Cercar totes les carp." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vista de miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensió de fitxer" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar per" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Llista i detalls" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "El nom de carpeta ja existeix" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar exten fitxer" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nom (A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nom (Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (més recents)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (més antics)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Anar a Els meus fitxers" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Melodies" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Cap cara detectada" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Afegir a l'inici" + diff --git a/data/po/cs.po b/data/po/cs.po new file mode 100644 index 0000000..bf5b1d1 --- /dev/null +++ b/data/po/cs.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Nahoru" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Domů" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Zobrazit podle seznamu" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Zobrazit podle miniatur" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Odstranění se nezdařilo" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Soubor DRM. Nelze odeslat" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neplatný název souboru" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Bylo dosaženo maximálního počtu složek" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Povolení bylo odepřeno" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Chyba odeslání" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Cílová složka je podsložkou zdrojové složky" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Soubor neexistuje" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nelze zkopírovat" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nelze přesunout" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nedostatek paměti v paměti telefonu. Odstraňte některé položky a opakujte akci" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopírování se nezdařilo" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Přesunutí se nezdařilo" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nedostatek paměti. Zbývá: %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Stejný název je již použit" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nelze přesunout. Cílová složka je shodná se zdrojovou složkou" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Vytvořit složku" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Vložit sem" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Výstrahy" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Pozadí" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Obrázky" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videa" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Zvuky" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Stažené položky" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Paměťová karta" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Externí úložiÅ¡tě" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Upravit" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Odstranit" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Přesun" + +msgid "IDS_MF_BODY_UP" +msgstr "Nahoru" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Přesunout sem" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopírovat" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Seřadit podle" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Hledat" + +msgid "IDS_MF_SK3_MORE" +msgstr "Další" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Vytvořit složku" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Název složky" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Moje album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Zobrazit jako" + +msgid "IDS_MF_SK3_BACK" +msgstr "Zpět" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moje videoklipy" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stav práv" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Dodavatel" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Počet" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Obsahuje" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuální" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Přejm." + +msgid "IDS_MF_BODY_TIME" +msgstr "Čas" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Násobek času" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Typ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neomezeno" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Nahradit" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Zvonění volajícího" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Jméno" + +msgid "IDS_MF_POP_COPIED" +msgstr "Zkopírováno" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Není nic vybráno" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nedostatek zásobníkové paměti" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedostatek paměti. Odstraňte některé položky" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Datum vytvoření" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informace GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Zeměpisná šířka GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Zeměpisná délka GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Verze GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Podrobnosti" + +msgid "IDS_MF_BODY_ANY" +msgstr "VÅ¡e" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Počet použití k dispozici" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Provést" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Předání" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nemožné" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Probíhá inicializace dat MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Možné" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Tisk" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Platnost" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nová složka" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Upravit" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Seřadit podle" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Přesunout sem" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Pokračovat" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopírování..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Vložit sem" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepodporovaný typ souboru" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Podrobnosti" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Vzestupně" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Sestupně" + +msgid "IDS_MF_TAB_ALL" +msgstr "VÅ¡e" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Hledat ve vÅ¡ech složk." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Zobrazení miniatur" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Zobrazit příponu souborů" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Seřadit podle" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Seznam a detaily" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Název složky již existuje" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Skrýt příponu souborů" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Název (od A do Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Název (od Z do A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (nejnovější)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (nejstarší)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Jít do Moje soubory" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Vyzvánění" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nebyl rozpoznán žádný obličej" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Př. na dom. obr." + diff --git a/data/po/da.po b/data/po/da.po new file mode 100644 index 0000000..e71d848 --- /dev/null +++ b/data/po/da.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Op" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Hjem" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Vis efter liste" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Vis efter miniature" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Sletning mislykkedes" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-fil. Kan ikke sende" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Ugyldigt filnavn" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Det maksimale antal mapper er nÃ¥et" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Tilladelse afslÃ¥et" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Afsendelsen mislykkedes" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Destinationsmappen er en undermappe til kildemappen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Fil findes ikke" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Kunne ikke kopiere" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Kunne ikke flytte" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Ikke tilstrækkelig telefonhukommelse. Slet nogle elementer, og prøv igen" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiering mislykkedes" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Flytning mislykkedes" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Ikke tilstrækkelig hukommelse. %s er tilgængelig" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Det samme navn er allerede i brug" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Kunne ikke flytte. Destinationsmappen er den samme som kildemappen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Opret mappe" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Sæt ind her" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Advarsler" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Baggrunde" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Billeder" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videoklip" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Lyde" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Hukommelseskort" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Eksternt lager" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Redigér" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Slet" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Flyt" + +msgid "IDS_MF_BODY_UP" +msgstr "Op" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Flyt hertil" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiér" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortér efter" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Søg" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mere" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Opret mappe" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mappenavn" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mit album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Vis som" + +msgid "IDS_MF_SK3_BACK" +msgstr "Tilbage" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mine videoklip" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Status for rettigheder" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Sælger" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Antal" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Indeholder" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuel" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Omdøb" + +msgid "IDS_MF_BODY_TIME" +msgstr "Tid" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Tidsforbrug" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ubegrænset" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Erstat" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Kontakt ringetone" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Navn" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopieret" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Intet er valgt" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Der er ikke tilstrækkelig heap-hukommelse" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Der er ikke tilstrækkelig hukommelse. Slet nogle elementer" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Oprettelsesdato" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-oplysninger" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-breddegrad" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-længdegrad" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS Version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detaljer" + +msgid "IDS_MF_BODY_ANY" +msgstr "VilkÃ¥rlig" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Gange tilbage" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Udfør" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Viderestiller" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Ikke mulig" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-data initialiserer..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Muligt" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Udskriv" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Gyldighed" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ny mappe" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Redigér" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sortér efter" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Flyt hertil" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Fortsæt" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopierer ..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Indsæt her" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Filtype understøttes ikke" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detaljeret visning" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Stigende" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Faldende" + +msgid "IDS_MF_TAB_ALL" +msgstr "Alle" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Søg i alle mapper" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniaturevisning" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Vis filtypenavn" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortér efter" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste og detaljer" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Mappenavnet findes allerede" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Skjul filtypenavn" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Navn (A til Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Navn (Z til A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dato (nyeste)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dato (ældste)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "GÃ¥ til Mine filer" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringetoner" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Intet ansigt detekteret" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Føj til start" + diff --git a/data/po/de_DE.po b/data/po/de_DE.po new file mode 100644 index 0000000..d1ce770 --- /dev/null +++ b/data/po/de_DE.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Hoch" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Nach Liste anzeigen" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "In Miniaturansicht anzeigen" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Löschen fehlgeschlagen" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-Datei. Kann nicht gesendet werden" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Dateiname ungültig" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximale Ordneranzahl erreicht" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Berechtigung abgelehnt" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Senden fehlgeschlagen" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Der Zielordner ist ein Unterordner des Quellordners" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Datei nicht vorhanden" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Kopieren nicht möglich" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Verschieben nicht möglich" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nicht genügend Platz im Telefonspeicher. Löschen Sie einige Elemente und versuchen Sie es erneut." + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopieren fehlgeschlagen" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Verschieben fehlgeschlagen" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nicht genügend Speicher. %s verfügbar" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Derselbe Name wird bereits verwendet" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Verschieben nicht möglich. Ziel- und Quellordner sind gleich" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Ordner erstellen" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Hier einfügen" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Signale" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Hintergrund" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Eigene Bilder" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Töne" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Speicher-\nkarte" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Externer Speicher" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Bearbeiten" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Löschen" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Verschieben" + +msgid "IDS_MF_BODY_UP" +msgstr "Hoch" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Hierher verschieben" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopieren" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortieren nach" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Suche" + +msgid "IDS_MF_SK3_MORE" +msgstr "Optionen" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Ordner erstellen" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ordnername" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Eigenes Album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Anzeigen als" + +msgid "IDS_MF_SK3_BACK" +msgstr "Zurück" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Eigene Videos" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Copyright-Status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Anbieter" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Anzahl" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Enthält" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuell" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervall" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Umben." + +msgid "IDS_MF_BODY_TIME" +msgstr "Zeit" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Zeitzählung" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Typ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Unbegrenzt" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Ersetzen" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Anruferklingelton" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Name" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopiert" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nichts ausgewählt" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nicht genügend dynamischer Speicher" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nicht genügend Speicher. Löschen Sie einige Elemente" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Erstellungsdatum" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-Informationen" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-Breite" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-Länge" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-Version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Details" + +msgid "IDS_MF_BODY_ANY" +msgstr "Jede" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Verfügbare Nutzungen" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Ausführen" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Weiterleitung" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nicht möglich" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-Daten werden initialisiert..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Möglich" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Drucken" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Gültigkeit" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Neuer Ordner" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Bearbeiten" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sortieren" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Hierher verschieben" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Weiter" + +msgid "IDS_MF_POP_COPYING" +msgstr "Wird kopiert..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Hier einfügen" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nicht unterstützter Dateityp" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detailansicht" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Aufsteigend" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Absteigend" + +msgid "IDS_MF_TAB_ALL" +msgstr "Alle" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Alle Ordner durchsuchen" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniaturansicht" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Dateierweiterung anzeigen" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortieren nach" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste und Details" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ordnername bereits vorhanden" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Dateierweit. ausbl." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Name (A bis Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Name (Z bis A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (neueste)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (älteste)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Eigene Dateien öffnen" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Klingeltöne" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Kein Gesicht erkannt" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Dem Startbildschirm hzfg." + diff --git a/data/po/el_GR.po b/data/po/el_GR.po new file mode 100644 index 0000000..aa4e199 --- /dev/null +++ b/data/po/el_GR.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Πάνω" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Προβολή ανά λίστα" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Προβολή μικρογραφιών" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Αποτυχία διαγραφής" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Αδύνατη αποστολή αρχείου DRM" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Μη έγκυρο όνομα αρχείου" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Μέγιστος" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Δεν έχετε δικαίωμα πρόσβασης" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Αποτυχία αποστολής" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Ο φάκελος προορισμού είναι υποφάκελος του φακέλου προέλευσης" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Δεν υπάρχει αρχείο" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Δεν είναι δυνατή η αντιγραφή" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Δεν είναι δυνατή η μετακίνηση" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Η μνήμη του τηλεφώνου δεν επαρκεί. Διαγράψτε ορισμένα στοιχεία και προσπαθήστε ξανά" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Αποτυχία αντιγραφής" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Αποτυχία μετακίνησης" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Δεν υπάρχει αρκετή μνήμη. Το στοιχείο %s είναι διαθέσιμο" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Το όνομα χρησιμοποιείται ήδη" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Δεν είναι δυνατή η μετακίνηση. Ο φάκελος προορισμού είναι ο ίδιος με το φάκελο προέλευσης" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Δημ/ργία φακέλου" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Επικόλληση εδώ" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Ειδοποιήσεις" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Θέματα φόντου" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Τηλέφωνο" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Εικόνες" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Βίντεο" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Ήχοι" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Λήψεις" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Κάρτα μνήμης" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Εξωτ. χώρος αποθήκ." + +msgid "IDS_MF_SK3_EDIT" +msgstr "Επεξεργ." + +msgid "IDS_MF_SK3_DELETE" +msgstr "Διαγραφή" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Μετακίνηση" + +msgid "IDS_MF_BODY_UP" +msgstr "Πάνω" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Μετακίνηση εδώ" + +msgid "IDS_MF_SK3_COPY" +msgstr "Αντιγραφή" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ταξινόμ. κατά" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Αναζήτηση" + +msgid "IDS_MF_SK3_MORE" +msgstr "Περισσότ." + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Δημ/ργία φακέλου" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Όνομα φακέλου" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Το άλμπουμ μου" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Προβολή ως" + +msgid "IDS_MF_SK3_BACK" +msgstr "Πίσω" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Τα βίντεο κλιπ μου" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Κατάσταση δικαιώματος" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Προμηθευτής" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Πλήθος αρχείων" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Περιέχει" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Μεμονωμένο" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Διάστημα" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Μετον." + +msgid "IDS_MF_BODY_TIME" +msgstr "Ώρα" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Χρονομετρημένη μέτρηση" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Τύπος" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Απεριόριστες" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Αντικατ." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Ήχος κλήσης καλούντος" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Όνομα" + +msgid "IDS_MF_POP_COPIED" +msgstr "Αντιγράφηκε" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Δεν έχει γίνει καμία επιλογή" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Ο σωρός μνήμης δεν επαρκεί" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Δεν υπάρχει αρκετή μνήμη. Διαγράψτε ορισμένα στοιχεία" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Ημερομηνία δημιουργίας" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Πληροφορίες GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Γεωγραφικό πλάτος GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Γεωγραφικό μήκος GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Έκδοση GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Λεπτομ." + +msgid "IDS_MF_BODY_ANY" +msgstr "Οποιοδήποτε" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Διαθέσιμες χρήσεις" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Εκτέλεση" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Προώθηση" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Αδύνατο" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Προετοιμασία των δεδομένων MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Δυνατό" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Εκτύπωση" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Ισχύς" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Νέος φάκελος" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Επεξεργασία" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Εμφάνιση ανά" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Μετακίνηση εδώ" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Συνέχεια;" + +msgid "IDS_MF_POP_COPYING" +msgstr "Αντιγραφή..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Επικόλληση εδώ" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Μη υποστηριζόμενος τύπος αρχείου" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Προβολή λεπτομερειών" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Αύξουσα" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Φθίνουσα" + +msgid "IDS_MF_TAB_ALL" +msgstr "Όλα" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Αναζ.σε όλους τους φακ." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Προβολή μικρογραφιών" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Προβολή επέκτασης αρχείου" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ταξινόμηση κατά" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Λίστα και λεπτομέρειες" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Το όνομα φακέλου υπάρχει ήδη" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Απόκρ. επέκτασης αρχ." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Όνομα (Α προς Ω)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Όνομα (Ω προς Α)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Ημερομηνία (Πιο πρόσφατο)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Ημερομηνία (Παλαιότερο)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Μετ. στα Αρχεία Μου" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ήχοι κλήσης" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Δεν ανιχνεύθηκε πρόσωπο" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Προσθ. στην αρχ." + diff --git a/data/po/en.po b/data/po/en.po new file mode 100644 index 0000000..be664df --- /dev/null +++ b/data/po/en.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Up" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "View by list" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "View by thumbnail" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Delete failed" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM file. Cannot send" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Invalid file name" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximum folder reached" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permission denied" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Send failed" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "The destination folder is a subfolder of the source folder" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "This file does not exist" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Unable to copy" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Unable to move" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Not enough memory in phone memory. Delete some items and try again" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Copying failed" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Moving failed" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Not enough memory. %s available" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Same name already in use" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Unable to move. Destination folder same as source folder" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alerts" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Wallpapers" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Phone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Images" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sounds" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memory card" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "External storage" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Edit" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Delete" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Move" + +msgid "IDS_MF_BODY_UP" +msgstr "Up" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copy" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Search" + +msgid "IDS_MF_SK3_MORE" +msgstr "More" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Folder name" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "My album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "View as" + +msgid "IDS_MF_SK3_BACK" +msgstr "Back" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "My video clips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Right status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Vendor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Count" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contains" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Rename" + +msgid "IDS_MF_BODY_TIME" +msgstr "Time" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Timed count" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Unlimited" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Replace" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Caller ringtone" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Name" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copied" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nothing selected" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Not enough heap memory" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Created date" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS information" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS latitude" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS longitude" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Details" + +msgid "IDS_MF_BODY_ANY" +msgstr "Any" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Available uses" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Execute" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Forwarding" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC data is initialising..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Print" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validity" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "New folder" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Edit" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "List by" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continue" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copying..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Unsupported file type" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detail view" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascending" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descending" + +msgid "IDS_MF_TAB_ALL" +msgstr "All" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Search all folders" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Thumbnail view" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Show file extension" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "List and details" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Folder name already exists" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Hide file extension" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Name (A to Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Name (Z to A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Date (most recent)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Date (oldest)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Go to My Files" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringtones" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "No face detected" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Add to home" + diff --git a/data/po/en_PH.po b/data/po/en_PH.po new file mode 100644 index 0000000..7996bb8 --- /dev/null +++ b/data/po/en_PH.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Up" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "View by list" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "View by thumbnail" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Delete failed" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM file. Cannot send" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Invalid file name" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximum folder reached" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permission denied" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Send failed" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "The destination folder is a subfolder of the source folder" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "This file does not exist" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Unable to copy" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Unable to move" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Not enough memory in phone memory. Delete some items and try again" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Copying failed" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Moving failed" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Not enough memory. %s available" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Same name already in use" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Unable to move. Destination folder same as source folder" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alerts" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Wallpapers" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Phone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Images" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sounds" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memory card" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "External storage" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Edit" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Delete" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Move" + +msgid "IDS_MF_BODY_UP" +msgstr "Up" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copy" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Search" + +msgid "IDS_MF_SK3_MORE" +msgstr "More" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Folder name" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "My album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "View as" + +msgid "IDS_MF_SK3_BACK" +msgstr "Back" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "My video clips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Right status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Vendor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Count" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contains" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Rename" + +msgid "IDS_MF_BODY_TIME" +msgstr "Time" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Timed count" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Unlimited" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Replace" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Caller ringtone" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Name" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copied" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nothing selected" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Not enough heap memory" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Created date" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS information" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS latitude" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS longitude" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Details" + +msgid "IDS_MF_BODY_ANY" +msgstr "Any" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Available uses" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Execute" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Forwarding" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC data is initializing…" + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Print" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validity" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "New folder" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Edit" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "List by" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continue" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copying..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Unsupported file type" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detail view" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascending" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descending" + +msgid "IDS_MF_TAB_ALL" +msgstr "All" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Search all folders" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Thumbnail view" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Show file extension" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "List and details" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Folder name already exists" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Hide file extension" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Name (A to Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Name (Z to A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Date (Most recent)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Date (Oldest)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Go to My Files" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringtones" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "No face detected" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Add to home" + diff --git a/data/po/en_US.po b/data/po/en_US.po new file mode 100644 index 0000000..7996bb8 --- /dev/null +++ b/data/po/en_US.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Up" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "View by list" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "View by thumbnail" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Delete failed" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM file. Cannot send" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Invalid file name" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximum folder reached" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permission denied" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Send failed" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "The destination folder is a subfolder of the source folder" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "This file does not exist" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Unable to copy" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Unable to move" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Not enough memory in phone memory. Delete some items and try again" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Copying failed" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Moving failed" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Not enough memory. %s available" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Same name already in use" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Unable to move. Destination folder same as source folder" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alerts" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Wallpapers" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Phone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Images" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sounds" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memory card" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "External storage" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Edit" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Delete" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Move" + +msgid "IDS_MF_BODY_UP" +msgstr "Up" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copy" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Search" + +msgid "IDS_MF_SK3_MORE" +msgstr "More" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Create folder" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Folder name" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "My album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "View as" + +msgid "IDS_MF_SK3_BACK" +msgstr "Back" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "My video clips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Right status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Vendor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Count" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contains" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Rename" + +msgid "IDS_MF_BODY_TIME" +msgstr "Time" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Timed count" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Unlimited" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Replace" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Caller ringtone" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Name" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copied" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nothing selected" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Not enough heap memory" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Not enough memory. Delete some items" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Created date" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS information" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS latitude" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS longitude" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Details" + +msgid "IDS_MF_BODY_ANY" +msgstr "Any" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Available uses" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Execute" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Forwarding" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC data is initializing…" + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Print" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validity" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "New folder" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Edit" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "List by" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Move here" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continue" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copying..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Paste here" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Unsupported file type" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detail view" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascending" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descending" + +msgid "IDS_MF_TAB_ALL" +msgstr "All" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Search all folders" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Thumbnail view" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Show file extension" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sort by" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "List and details" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Folder name already exists" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Hide file extension" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Name (A to Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Name (Z to A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Date (Most recent)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Date (Oldest)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Go to My Files" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringtones" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "No face detected" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Add to home" + diff --git a/data/po/es_ES.po b/data/po/es_ES.po new file mode 100644 index 0000000..3b55ddc --- /dev/null +++ b/data/po/es_ES.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Arriba" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Inicio" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ver por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Ver en miniaturas" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Error al borrar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Archivo DRM. No se puede enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nombre de archivo no válido" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Máximo" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permiso denegado" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Error de envío" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "La carpeta de destino es una subcarpeta de la carpeta de origen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "El archivo no existe" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "No se puede copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "No se puede mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "No hay espacio suficiente en la memoria del teléfono. Elimine algunos elementos y vuelva a intentarlo" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Error al copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Error al mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "No hay memoria suficiente. %s disponible" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "El mismo nombre ya está en uso" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "No se puede mover. La carpeta de destino es la misma que la de origen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fondos de pantalla" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Teléfono" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imágenes" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sonidos" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descargas" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Tarjeta memoria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Almacenamiento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eliminar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Arriba" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Buscar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Más" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nombre de carpeta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mi álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Ver como" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atrás" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mis clips de vídeo" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estado correcto" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Proveedor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Contar" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contiene" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Renomb" + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Recuento de tiempo" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitado" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Reempl" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Melodía del llamante" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nombre" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "No se ha seleccionado nada" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "No hay memoria de ejecución suficiente" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "No hay memoria suficiente. Elimine algunos elementos" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Fecha creada" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Información de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitud GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitud GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versión GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalles" + +msgid "IDS_MF_BODY_ANY" +msgstr "Cualquiera" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usos disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Ejecutar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reenviando" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Imposible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Los datos MMC se están inicializando..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validez" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nueva carpeta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Mostrar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiando..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de archivo no admitido" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista de detalle" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Todos" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Buscar todas las carp." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vista en miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensiones de los archivos" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista y detalles" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "El nombre de carpeta ya existe" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar ext archivo" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nombre (A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nombre (Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Fecha (más reciente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Fecha (más antiguo)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir a Mis archivos" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Melodías" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ninguna cara detectada" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Añadir a inicio" + diff --git a/data/po/es_MX.po b/data/po/es_MX.po new file mode 100644 index 0000000..8161633 --- /dev/null +++ b/data/po/es_MX.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Arriba" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Inicio" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ver por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Ver como diapositiva" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Error al eliminar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Archivo DRM. No se puede enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nombre de fichero incorrecto" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Máximo" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permiso denegado" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Error de envío" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "La carpeta de destino es una subcarpeta de la carpeta de origen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "El archivo no existe" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "No se puede copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "No se puede mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memoria insuficiente en la memoria del teléfono. Elimine algunos elementos e inténtelo de nuevo" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Error al copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Error al mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Memoria insuficiente. %s disponible" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ya existe ese nombre" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "No se puede mover. La carpeta de destino es la misma que la de origen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fondos de pantalla" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Teléfono" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imágenes" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sonidos" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descargas" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Tarjeta de memoria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Almacenamiento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eliminar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Arriba" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Buscar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Más" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nombre de carpeta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mi álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Ver por" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atrás" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mis videos" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estados de derechos" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Proveedor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Recuento" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contenido" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Renomb" + +msgid "IDS_MF_BODY_TIME" +msgstr "Fecha" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Recuento de tiempo" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitado" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Reempl." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "ID del llamante" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nombre" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "No se ha seleccionado nada" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "No hay suficiente área de memoria dinámica" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insuficiente. Elimine algunos elementos" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Crear fecha" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Información de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitud GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitud GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versión GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalles" + +msgid "IDS_MF_BODY_ANY" +msgstr "Cualquiera" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usos disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Ejecutar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reenvío" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Imposible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Los datos MMC se están inicializando..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validez" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nueva carpeta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiando..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de archivo no admitido" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista de detalle" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Todo" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Buscar en todas carp." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Ver por miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensión del archivo" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista y detalles" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "El nombre de carpeta ya existe" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar ext. del arch." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nombre (A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nombre (Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Fecha (más reciente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Fecha (más antigua)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir a Mis Archivos" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tonos de llamada" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ningún rostro detectado" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Añadir al inicio" + diff --git a/data/po/es_US.po b/data/po/es_US.po new file mode 100644 index 0000000..ff81b32 --- /dev/null +++ b/data/po/es_US.po @@ -0,0 +1,309 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Arriba" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Inicio" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ver por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Ver como diapositiva" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Error al eliminar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Archivo DRM. No se puede enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nombre de fichero incorrecto" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Máximo" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permiso denegado" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Error de envío" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "La carpeta de destino es una subcarpeta de la carpeta de origen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "El archivo no existe" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "No se puede copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "No se puede mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memoria insuficiente en la memoria del teléfono. Elimine algunos elementos e inténtelo de nuevo" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Error al copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Error al mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Memoria insuficiente. %s disponible" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ya existe ese nombre" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "No se puede mover. La carpeta de destino es la misma que la de origen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fondos de pantalla" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Teléfono" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imágenes" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sonidos" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descargas" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Tarjeta de memoria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Almacenamiento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eliminar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Arriba" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Buscar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Más" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nombre de carpeta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mi álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Ver por" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atrás" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mis videos" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estados de derechos" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Proveedor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Recuento" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contenido" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Renomb" + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Recuento de tiempo" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitado" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Reempl." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "ID del llamante" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nombre" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "No se ha seleccionado nada" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "No hay suficiente área de memoria dinámica" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insuficiente. Elimine algunos elementos" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Crear fecha" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Información de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitud GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitud GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versión GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalles" + +msgid "IDS_MF_BODY_ANY" +msgstr "Cualquiera" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usos disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Ejecutar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reenvío" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Imposible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Los datos MMC se están inicializando..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validez" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nueva carpeta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiando..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de archivo no admitido" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista de detalle" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Todo" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Buscar en todas carp." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Ver por miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensión del archivo" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista y detalles" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar ext. del arch." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nombre (A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nombre (Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Fecha (más reciente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Fecha (más antigua)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir a Mis Archivos" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tonos de llamada" + diff --git a/data/po/et.po b/data/po/et.po new file mode 100644 index 0000000..115aeb6 --- /dev/null +++ b/data/po/et.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Üles" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Avaleht" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Kuva loendi järgi" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Vaata pisipiltidena" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "BT-peakomplekt sees" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM kaitsega fail. Ei saa saata" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Vigane failinimi" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Saavutatud on maksimaalne kaustade arv" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Loast keelduti" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Saatmine nurjus" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Sihtkaust on lähtekausta alamkaust" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Seda faili pole olemas" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Ei saa kopeerida" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ei saa teisaldada" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Telefoni mälus pole piisavalt vaba ruumi. Kustutage mõned üksused ja proovige uuesti" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Teisaldamine nurjus" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Teisaldamine nurjus" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Pole piisavalt mälu. %s saadaval" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "See nimi on juba kasutusel" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ei saa teisaldada. Sihtkaust ühtib allikaga" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Loo kaust" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Kleebi siia" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Automaatne salvestamine" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Taustpildid" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Pildid" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videod" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Helid" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Allalaet. failid" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Mälukaart" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Välismälu" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Muuda" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Kustuta" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Teisalda" + +msgid "IDS_MF_BODY_UP" +msgstr "Üles" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Teisalda siia" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopeeri" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortimine:" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Otsi" + +msgid "IDS_MF_SK3_MORE" +msgstr "Veel" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Loo kaust" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Kausta nimi" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Minu album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Kuvamisviis" + +msgid "IDS_MF_SK3_BACK" +msgstr "Tagasi" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Minu videoklipid" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Õiguse olek" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Tarnija" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Loendamine" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Sisaldab" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuaalne" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervall" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Nim üm" + +msgid "IDS_MF_BODY_TIME" +msgstr "Kellaaeg" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Piiratud aeg" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tüüp" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Piiramatu" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Asenda" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Helistaja helin" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nimi" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopeeritud" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Valik tegemata" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Ei ole piisavalt mälu" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mälu pole piisavalt. Kustutage mõned üksused" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Loomise kuupäev" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-teave" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-laius" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-pikkus" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-i versioon" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Üksikasjad" + +msgid "IDS_MF_BODY_ANY" +msgstr "Ükskõik milline" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Võimalikud kasutusviisid" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Käivita" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Edastamine" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Võimatu" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC andmed lähtestatakse..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Võimalik" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Prindi" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Kehtivus" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Uus kaust" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Muuda" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Loendi järgi" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Teisalda siia" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Jätka" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopeerimine..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Kleebi siia" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Toetuseta failitüüp" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Üksikasjalik vaade" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Tõusev" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Langev" + +msgid "IDS_MF_TAB_ALL" +msgstr "Kõik" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Otsi kaustadest" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Pisipildivaade" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Kuva faililaiend" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortimisalus" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Loend ja üksikasjad" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Kaustanimi on juba olemas" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Peida faililaiend" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nimi (A‒Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nimi (Z‒A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Kuupäev (kõige hilisemast)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Kuupäev (kõige vanemast)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Mine Minu Failidesse" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Helinad" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nägu pole tuvastatud" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Lisa avaekr.-le" + diff --git a/data/po/eu.po b/data/po/eu.po new file mode 100644 index 0000000..f0b840a --- /dev/null +++ b/data/po/eu.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Gora" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Etxea" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Zerrenda bidez ikusi" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Miniatura bidez ikusi" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Akatsa ezabatzerakoan" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM artxiboa. Ezin da bidali" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Fitxategi izen baliogabea" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Gehienezko karpeta kopurura heldu da" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Baimena ukatuta" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Akatsa bidaltzerakoan" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Helburu karpeta sorburu karpetaren azpi-karpeta bat da" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Fitxategia ez dago" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Ezin da kopiatu" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ezin da mugitu" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Ez dago nahikoa memoria telefonoan. Ezabatu hainbat elementu eta saiatu berriz" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Errorea kopiatzerakoan" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Errorea mugitzerakoan" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Ez dago memoria nahikorik. %s erabilgarri" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Izen bera dagoeneko erabiltzen" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ezin da mugitu. Jomugako karpeta jatorrizkoa bera da" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Sortu karpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Hemen erantsi" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Abisuak" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Pantaila atzealdea" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefonoa" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Irudiak" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Bideoak" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Soinuak" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Deskargak" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memoria txartela" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Kanpo memoria" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editatu" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Ezabatu" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mugitu" + +msgid "IDS_MF_BODY_UP" +msgstr "Gora" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Hona mugitu" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiatu" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sailkatu honela" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Bilatu" + +msgid "IDS_MF_SK3_MORE" +msgstr "Gehiago" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Karpeta sortu" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Karpetaren izena" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Nire albuma" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Nola ikusi" + +msgid "IDS_MF_SK3_BACK" +msgstr "ATZERA" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Nire bideo klipak" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Egoera egokia" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Hornitzailea" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Kontatu" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Edukiak" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Indibiduala" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Tartea" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Berrizend." + +msgid "IDS_MF_BODY_TIME" +msgstr "Ordua" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Mugatutako zenbaketa" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Mota" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Mugagabea" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Ordeztu" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Dei egilearen dei doinua" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Izena" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopiatuta" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ez da ezer aukeratu" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Ez dago pilatutako memoria nahikoa" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ez dago memoria nahikoa. Elementu batzuk ezabatu" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Sortutako data" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informazioa" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS latitudea" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS longitudea" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS bertsioa" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Xehetasunak" + +msgid "IDS_MF_BODY_ANY" +msgstr "Edozein" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Erabilera eskuragarriak" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Abiarazi" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Birbidaltzea" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Ezinezkoa" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC datuak abiarazten..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Inprimatu" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Baliozkotasuna" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Karpeta berria" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editatu" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Honen arabera zerrendatu" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Hona mugitu" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Jarraitu" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiatzen..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Hemen erantsi" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Fitxategi mota ez bateragarria" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Xehetasun ikuspegia" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Goranzkoa" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Beheranzkoa" + +msgid "IDS_MF_TAB_ALL" +msgstr "Guztia(k)" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Bilatu karpeta guztiak" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatura ikuspegia" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Erakutsi fitxategiaren luzapena" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Honen bidez antolatu" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Zerrenda eta xehetasunak" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Karpetaren izena dagoeneko bada" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ezkutatu fitx. luzapena" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Izena (Atik Zra)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Izena (Ztik Ara)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (Berriena)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (Zaharrena)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Joan Nire Fitxat." + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Dei doinuak" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ez da aurpegirik detektatu" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Gehitu nagusira" + diff --git a/data/po/fi.po b/data/po/fi.po new file mode 100644 index 0000000..e1725a4 --- /dev/null +++ b/data/po/fi.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Ylös" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Koti" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Katso luettelossa" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Näytä pikkukuvina" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Poisto epäonnistui" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-tiedosto. Ei voi lähettää" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Virheellinen tiedostonimi" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Kansioiden enimmäismäärä saavutettu" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Lupa evätty" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Lähetys epäonnistui" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Kohdekansio on lähdekansion alikansio" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Tiedostoa ei ole" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Ei voi kopioida" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ei voi siirtää" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Puhelimen muisti ei riitä. Poista kohteita ja yritä uudelleen" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiointi epäonnistui" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Siirto epäonnistui" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Muisti ei riitä. %s käytettävissä" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Sama nimi on jo käytössä" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ei voi siirtää. Kohdekansio on sama kuin lähdekansio" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Luo kansio" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Liitä tänne" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Hälytykset" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Taustakuvat" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Puhelin" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Kuvat" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videot" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Äänet" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Lataukset" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Muistik." + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Ulk. tallennuslaite" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Muokkaa" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Poista" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Siirrä" + +msgid "IDS_MF_BODY_UP" +msgstr "Ylös" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Siirrä tänne" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopioi" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Laj.per." + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Etsi" + +msgid "IDS_MF_SK3_MORE" +msgstr "Lisää" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Luo kansio" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Kansion nimi" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Oma albumi" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Katsele muodossa" + +msgid "IDS_MF_SK3_BACK" +msgstr "Takaisin" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Omat videoleikkeet" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Oikeustila" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Toimittaja" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Määrä" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Sisältää" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Yksittäinen" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Väli" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "N.uud." + +msgid "IDS_MF_BODY_TIME" +msgstr "Aika" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Ajoitettu määrä" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tyyppi" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Rajoittamaton" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Korvaa" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Soittajan soittoääni" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nimi" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopioitu" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Mitään ei valittu" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Kekomuisti ei riitä" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Muisti ei riitä. Poista joitain kohteita" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Luontipäivämäärä" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-tiedot" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-leveysaste" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-pituusaste" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-versio" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Lisätiedot" + +msgid "IDS_MF_BODY_ANY" +msgstr "Mikä tahansa" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Jäljellä olevat käyttökerrat" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Suorita" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Edelleenlähetys" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Mahdoton" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-tietoja alustetaan..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mahdollinen" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Tulosta" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Kelpoisuus" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Uusi kansio" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Muokkaa" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Lajitteluperuste" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Siirrä tänne" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Jatka" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopioidaan..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Liitä tänne" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tiedostotyyppiä ei tueta" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Tarkka näkymä" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Nouseva" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Laskeva" + +msgid "IDS_MF_TAB_ALL" +msgstr "Kaikki" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Hae kaikista kansioista" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Pikkukuvanäkymä" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Näytä tiedostotunniste" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Lajitteluperuste" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Luettelo ja tiedot" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Kansion nimi on jo olemassa" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Piilota tiedostolaaj." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nimi (A–Ö)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nimi (Ö–A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Päivämäärä (Uusimmat)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Päivämäärä (Vanhimmat)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Siirry Omiin tiedostoihin" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Soittoäänet" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Kasvoja ei tunnistettu" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Lisää etusivulle" + diff --git a/data/po/fr_CA.po b/data/po/fr_CA.po new file mode 100644 index 0000000..07b8c60 --- /dev/null +++ b/data/po/fr_CA.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Haut" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Accueil" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Afficher par liste" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Afficher par miniature" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Échec de suppression" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Fichier GDN. Envoi impossible" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nom de fichier incorrect" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Capacité maximum atteinte" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Autorisation refusée" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Envoi échoué" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Le dossier cible est un sous-dossier du dossier source" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Fichier inexistant" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Copie impossible" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Déplacement impossible" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Mémoire du téléphone insuffisante. Supprimez certains éléments et réessayez" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Échec de copie" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Échec du déplacement" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Mémoire insuffisante. %s disponible(s)" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Nom déjà utilisé" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Déplacement impossible. Les dossiers source et cible sont identiques" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Créer dossier" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Coller ici" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertes" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fonds d'écran" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Téléphone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Images" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vidéos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Télécharg." + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Carte mémoire" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Stockage externe" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Modifier" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Supprimer" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Déplacer" + +msgid "IDS_MF_BODY_UP" +msgstr "Haut" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Déplacer ici" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copier" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Trier par" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Rechercher" + +msgid "IDS_MF_SK3_MORE" +msgstr "Plus" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Créer un dossier" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nom de dossier" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mon album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Afficher comme" + +msgid "IDS_MF_SK3_BACK" +msgstr "Retour" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mes clips vidéo" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Information sur les droits" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Fournisseur" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Compte" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contient" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuel" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalle" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Renom." + +msgid "IDS_MF_BODY_TIME" +msgstr "Heure" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Temps restant" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Illimité" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Rempl." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Sonnerie de l'appelant" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nom" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copié" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Aucune sélection" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Mémoire de la pile insuffisante" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mémoire insuffisante. Supprimez certains éléments" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Date de création" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informations GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitude GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitude GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Version GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Détails" + +msgid "IDS_MF_BODY_ANY" +msgstr "N'importe" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Utilisations disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Exécuter" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Transfert" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Données MMC en cours d'initialisation..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimer" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validité" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nouveau dossier" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Modifier" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Trier par" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Déplacer ici" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuer" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copie ..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Coller ici" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Type de fichier non pris en charge" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Affichage détaillé" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Croissant" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Décroissant" + +msgid "IDS_MF_TAB_ALL" +msgstr "Tout" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Rech. dans ts dossiers" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Affichage miniature" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Afficher l'extension du fichier" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Trier par" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste et détails" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nom de dossier existe déjà" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Masq. extens. fichier" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nom (A à Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nom (Z à A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Date (les plus récents)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Date (les plus anciens)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Accès à Mes fichiers" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Sonneries" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Aucun visage détecté" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Aj. à l'accueil" + diff --git a/data/po/fr_FR.po b/data/po/fr_FR.po new file mode 100644 index 0000000..64e3b3f --- /dev/null +++ b/data/po/fr_FR.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Haut" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Accueil" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Afficher par liste" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Afficher par miniature" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Échec de suppression" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Fichier DRM. Envoi impossible" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nom de fichier incorrect" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Capacité maximum atteinte" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Autorisation refusée" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Envoi impossible" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Le dossier cible est un sous-dossier du dossier source" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Fichier inexistant" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Copie impossible." + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Déplacement impossible" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Mémoire du téléphone insuffisante. Supprimez certains éléments et réessayez" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Échec copie" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Échec du déplacement" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Mémoire insuffisante. %s disponible(s)" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Nom déjà utilisé" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Déplacement impossible. Les dossiers source et cible sont identiques" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Créer dossier" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Coller ici" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertes" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fonds d'écran" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Téléphone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Images" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vidéos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Téléchargements" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Carte mémoire" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Stockage externe" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Modifier" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Supprimer" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Déplacer" + +msgid "IDS_MF_BODY_UP" +msgstr "Haut" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Déplacer ici" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copier" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Trier par" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Chercher" + +msgid "IDS_MF_SK3_MORE" +msgstr "Plus" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Créer dossier" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nom de dossier" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mon album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Visualiser comme" + +msgid "IDS_MF_SK3_BACK" +msgstr "Retour" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mes clips vidéo" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Information sur les droits" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Fournisseur" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Compte" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contenu" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuel" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalle" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Nv nom" + +msgid "IDS_MF_BODY_TIME" +msgstr "Heure" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Temps restant" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Illimité" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Rempl." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Sonnerie d'appelant" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nom" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copié" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Aucune sélection" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Mémoire de la pile insuffisante" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Mémoire insuffisante. Supprimez certains éléments" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Date de création" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informations GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitude GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitude GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Version GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Détails" + +msgid "IDS_MF_BODY_ANY" +msgstr "N'importe" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Utilisations disponibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Exécuter" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Transfert" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Données MMC en cours d'initialisation..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimer" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validité" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nouveau dossier" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Modifier" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Trier par" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Déplacer ici" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuer" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copie..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Coller ici" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Type de fichier non pris en charge" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Affichage détaillé" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Croissant" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Décroissant" + +msgid "IDS_MF_TAB_ALL" +msgstr "Tout" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Rech. dans ts dossiers" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Affichage miniature" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Afficher l'extension du fichier" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Trier par" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste et détails" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nom de dossier déjà utilisé" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Masq. extens. fichier" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nom (A à Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nom (Z à A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Date (Les plus récents)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Date (Les plus anciens)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Accès à Mes fichiers" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Sonneries" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Aucun portrait détecté" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Aj. à l'accueil" + diff --git a/data/po/ga.po b/data/po/ga.po new file mode 100644 index 0000000..340f171 --- /dev/null +++ b/data/po/ga.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Suas" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Baile" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Amharc de réir liosta" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Amharc de réir mionsamhla" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Theip ar scriosadh" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Comhad DRL. Ní féidir seoladh" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Comhadainm neamhbhailí" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Uaslíon na bhfillteán bainte amach" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Cead séanta" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Theip ar sheoladh" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Is fo-fhillteán de chuid an fhillteáin fhoinsigh é an fillteán sprice" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Níl an comhad seo ann" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Ní féidir cóipeáil" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ní féidir bogadh" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Easpa cuimhne san fhón. Scrios roinnt míreanna agus triail arís" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Theip ar chóipeáil" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Theip ar bhogadh" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Easpa cuimhne. %s ar fáil" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ainm céanna in úsáid cheana" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ní féidir bogadh. Is ionann an fillteán sprice agus an fillteán fuinseach" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Déan fillteán" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Greamaigh anseo" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Foláirimh" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Cúlbhrait" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Fón" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Íomhánna" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Físeáin" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Fuaimeanna" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Ioslódálacha" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Cárta cuimhne" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Stóras seachtrach" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Cuir in eagar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Scrios" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Bog" + +msgid "IDS_MF_BODY_UP" +msgstr "Suas" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Bog anseo" + +msgid "IDS_MF_SK3_COPY" +msgstr "Cóipeáil" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sórtáil de réir" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Cuardach" + +msgid "IDS_MF_SK3_MORE" +msgstr "Tuilleadh" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Déan fillteán" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ainm an fhillteáin" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "M'albam" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Amharc mar" + +msgid "IDS_MF_SK3_BACK" +msgstr "Siar" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mo ghearrthóga físe" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stádas ceart" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Díoltóir" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Áireamh" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Istigh tá:" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Duine aonair" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Eatramh" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Athainm" + +msgid "IDS_MF_BODY_TIME" +msgstr "Am" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Áireamh amaithe" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Cineál" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Gan teorainn" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Ionadú" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Clingthon glaoiteora" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Ainm" + +msgid "IDS_MF_POP_COPIED" +msgstr "Cóipeáilte" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Dada roghnaithe" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Easpa carnchuimhne" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Easpa cuimhne. Scrios roinnt míreanna" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Dáta cruthaithe" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Faisnéis faoi GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Domhanleithead GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Domhanfhad GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Leagan GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Sonraí" + +msgid "IDS_MF_BODY_ANY" +msgstr "Ceann ar bith" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Úsáidí atá ar fáil" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Rith" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Seoladh ar aghaidh" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Dodhéanta" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Sonraí MMC á dtúsú..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Indéanta" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Priontáil" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Bailíocht" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Fillteán nua" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Cuir in eagar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Liostaigh de réir" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Bog anseo" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Ar aghaidh" + +msgid "IDS_MF_POP_COPYING" +msgstr "Ag cóipeáil..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Greamaigh anseo" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Cineál comhaid gan tacú" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Amharc ar shonraí" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ardaitheach" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "In ord íslitheach" + +msgid "IDS_MF_TAB_ALL" +msgstr "Gach" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Cuardaigh gach fillteán" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Radharc mionsamhla" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Taispeáin iarmhír chomhadainm" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sórtáil de réir" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liosta agus sonraí" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ainm an fhillteáin ann cheana" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Fol. iarmhír comhaid" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Ainm (A go Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Ainm (Z go A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dáta (Cinn is déanaí)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dáta (Cinn is sine)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Gabh go Mo Chomhaid" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Clingthoin" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Níor aimsíodh aghaidh" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Cuir le baile" + diff --git a/data/po/gl.po b/data/po/gl.po new file mode 100644 index 0000000..18a036e --- /dev/null +++ b/data/po/gl.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Arriba" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Particular" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ver por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Ver en miniatura" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Erro ao eliminar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Arquivo DRM. Non se pode enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nome de arquivo non válido" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Número máximo de carpetas alcanzado" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permiso denegado" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Erro ao enviar" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "A carpeta de destino é unha subcarpeta da carpeta de orixe" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "O arquivo non existe" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Non se pode copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Non se pode mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Non hai suficiente memoria no teléfono. Elimina algúns elementos e inténtao de novo" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Erro ao copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Erro ao mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Non hai suficiente memoria. %s dispoñible" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Este nome xa está en uso" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Non se pode mover. Mesma carpeta de destino que de orixe" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fondos" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Teléfono" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imaxes" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descargas" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Tarx. de memoria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Almacenamento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eliminar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Arriba" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Buscar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Máis" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crear carpeta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nome de carpeta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "O meu Álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Ver como" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atrás" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Os meus videoclips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estado correcto" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Provedor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Contar" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contén" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "C nome" + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Conta restante" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitada" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Substit" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Melodía do chamante" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nome" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Non se seleccionou nada" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Non hai suficiente memoria dinámica" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Non hai suficiente memoria. Elimine algúns elementos" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Data de creación" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Información GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitude GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Lonxitude GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versión GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalles" + +msgid "IDS_MF_BODY_ANY" +msgstr "Calquera" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usos dispoñibles" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Executar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reenviando" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Non é posible" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Os datos MMC estanse inicializando..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posible" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validez" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nova carpeta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover aquí" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiando..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Pegar aquí" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de arquivo non admitido" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista detallada" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Todo" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Buscar todas carpetas" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vista en miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensión do arquivo" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista e detalles" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "O nome da carpeta xa existe" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocult. extens. arquivo" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nome (A-Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nome (Z-A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (A máis recente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (A máis antiga)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir a Os Meus Arquiv" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Melodías" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Non se detectou ningunha cara" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Engad. ao inicio" + diff --git a/data/po/hi.po b/data/po/hi.po new file mode 100644 index 0000000..fb5ecce --- /dev/null +++ b/data/po/hi.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "ऊपर" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "घर" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "सूची से देखें" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "थंबनेल से देखें" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "हटाना विफल" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM फाइल। भेज नहीं सकते" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "फाइल नाम अवैध है" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "अधिकतम फ़ोल्‍डर पहुँचे" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "अनुमति से इनकार" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "भेजना असफल" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "गंतव्य फ़ोल्डर स्त्रोत फ़ोल्डर का उप फ़ोल्डर है" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "यह फ़ाइल मौजूद नहीं है" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "कॉपी करने में अक्षम" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "मूव करने में अक्षम" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "फ़ोन मेमोरी में पर्याप्त मेमोरी नहीं है। कुछ आइटम्स हटाएँ और फिर प्रयास करें" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "कॉपी करना विफल" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "ले जाना विफल हुआ" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "पर्याप्‍त मेमोरी नहीं है। %s उपल्‍ब्‍ध है" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "ऐसा ही नाम पहले से इस्तेमाल में है" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "मूव करने में असमर्थ। गंतव्य फोल्डर स्रोत फोल्डर की तरह है" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "फ़ोल्‍डर बनाएँ" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "यहाँ पेस्‍ट करें" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "अलर्ट्स" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "वॉलपेपर्स" + +msgid "IDS_MF_TAB_PHONE" +msgstr "फोन" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "छवियाँ" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "विडियो" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "ध्वनियाँ" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "डाउनलोड" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "मेमोरी कार्ड" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "बाह्य स्टोरेज" + +msgid "IDS_MF_SK3_EDIT" +msgstr "संपादन" + +msgid "IDS_MF_SK3_DELETE" +msgstr "हटाएँ" + +msgid "IDS_MF_SK3_MOVE" +msgstr "मूव" + +msgid "IDS_MF_BODY_UP" +msgstr "ऊपर" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "यहाँ मूव करें" + +msgid "IDS_MF_SK3_COPY" +msgstr "कॉपी" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "द्वारा छाँटें" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "खोजें" + +msgid "IDS_MF_SK3_MORE" +msgstr "अधिक" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "फोल्डर बनाएँ" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "फोल्डर का नाम" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "मेरी एल्बम" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "के रूप में देखें" + +msgid "IDS_MF_SK3_BACK" +msgstr "पीछे" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "मेरे वीडियो क्लिप" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "सही स्थिति" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "विक्रेता" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "गणना" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "शामिल" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "अलग" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "अन्तराल" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "रिनेम" + +msgid "IDS_MF_BODY_TIME" +msgstr "समय" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "समय गणना" + +msgid "IDS_MF_BODY_TYPE" +msgstr "प्रकार" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "असीमित" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "बदलें" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "कॉलर रिंगटोन" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "नाम" + +msgid "IDS_MF_POP_COPIED" +msgstr "कॉपी हुआ" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "कुछ चयनित नहीं" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "पर्याप्‍त हीप मेमोरी नहीं है" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "पर्याप्त मेमोरी नहीं। कुछ मदें हटाएँ" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "बनाए जाने की तिथि" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS जानकारी" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS अक्षांश" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS रेखांश" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS संस्करण" + +msgid "IDS_MF_SK_DETAILS" +msgstr "विवरण" + +msgid "IDS_MF_BODY_ANY" +msgstr "कोई" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "उपलब्ध उपयोग" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "निष्पादित करें" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "अग्रेषण" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "असंभव" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC डेटा आरंभ किया जा रहा है..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "संभव" + +msgid "IDS_MF_BODY_PRINT" +msgstr "प्रिंट करें" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "वैधता" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "नया फ़ोल्‍डर" + +msgid "IDS_MF_OPT_EDIT" +msgstr "संपादित करें" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "द्वारा सूची" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "यहाँ जाएँ" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "जारी रखें" + +msgid "IDS_MF_POP_COPYING" +msgstr "कॉपी कर रहा है…" + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "यहाँ पेस्‍ट करें" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "असमर्थित फाइल प्रकार" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "विवरण दृश्य" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "आरोही क्रम" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "अवरोही क्रम" + +msgid "IDS_MF_TAB_ALL" +msgstr "सभी" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "सभी फ़ोल्डर खोजें" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "थम्बनेल दृश्य" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "फ़ाइल एक्स्टेंशन दिखाएँ" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "से छाटें" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "सूची और विवरण" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "फ़ोल्डर का नाम पहले से मौजूद है" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "फ़ाइल एक्सटेंशन छिपाएँ" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "नाम (A से Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "नाम (Z से A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "तारीख (हालही का सबसे नवीनतम)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "तारीख (सबसे पुराने)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "मेरी फाइल्स में जाएँ" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "रिंगटोन" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "कोई चेहरा पहचाना नहीं गया" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "होम में जोड़े" + diff --git a/data/po/hr.po b/data/po/hr.po new file mode 100644 index 0000000..25d7730 --- /dev/null +++ b/data/po/hr.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Gore" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Početna" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Prikaz po popisu" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Prikaži kao sličice" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Brisanje neuspjeÅ¡no" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "ZaÅ¡tićena datoteka. Nemoguće poslati" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neispravno ime datoteke" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Dostignut maksimalan broj mapa" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Dozvola odbijena" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Slanje neuspjeÅ¡no" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "OdrediÅ¡na mapa je podmapa izvoriÅ¡ne mape" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Datoteka ne postoji" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nemoguće kopirati" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nemoguće premjestiti" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nedovoljno memorije u telefonu. ObriÅ¡ite stavke i ponovite" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiranje neuspjeÅ¡no" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "PremjeÅ¡tanje neuspjeÅ¡no" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nedovoljno memorije. Dostupno %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Već postoji isto ime" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nemoguće premjestiti. OdrediÅ¡na mapa ista je kao i izvorna" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Nova mapa" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Zalijepi ovdje" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Upozorenja" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Pozadine" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Slike" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Zvukovi" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Skidanja" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Mem. kartica" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Vanjska memorija" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Uredi" + +msgid "IDS_MF_SK3_DELETE" +msgstr "ObriÅ¡i" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Premjesti" + +msgid "IDS_MF_BODY_UP" +msgstr "Gore" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Premjesti ovdje" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiraj" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Poredaj po" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Traži" + +msgid "IDS_MF_SK3_MORE" +msgstr "ViÅ¡e" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Nova mapa" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ime mape" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Moj album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Pregled kao" + +msgid "IDS_MF_SK3_BACK" +msgstr "Nazad" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moj video" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Prava" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Dobavljač" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Broj" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Sadrži" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individualno" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Pr.ime" + +msgid "IDS_MF_BODY_TIME" +msgstr "Vrijeme" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Preostalo vrijeme" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Vrsta" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neograničeno" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Zamijeni" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Ton pozivatelja" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Naziv" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopirano" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "NiÅ¡ta odabrano" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nedovoljno pričuvne memorije" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedovoljno memorije. ObriÅ¡ite neke datoteke" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Datum izrade" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS podaci" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS zemljopisna Å¡irina" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS zemljopisna dužina" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS inačica" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalji" + +msgid "IDS_MF_BODY_ANY" +msgstr "Bilo koji" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Preostalo upotreba" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Pokreni" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Prosljeđivanje" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nemoguće" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Učitavanje podataka mem. kartice..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Moguće" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Ispis" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Valjanost" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nova mapa" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Uredi" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sortiraj po" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Premjesti ovdje" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Nastavak" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiranje..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Zalijepi ovdje" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepodržana datoteka" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detaljni prikaz" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "A-Z" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Z-A" + +msgid "IDS_MF_TAB_ALL" +msgstr "Sve" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Pretraži sve mape" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Sličice" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Prikaz ekstenzija datoteka" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortiraj po" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Popis i detalji" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ime mape već postoji" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Sakrij datotečni nast." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Naziv (A do Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Naziv (Z do A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (najnoviji)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (najstariji)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Idi u Datoteke" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tonovi zvona" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Lice nije prepoznato" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Dodaj na početnu" + diff --git a/data/po/hu.po b/data/po/hu.po new file mode 100644 index 0000000..0bb3f28 --- /dev/null +++ b/data/po/hu.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Fel" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Kezdőkép." + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Listanézet" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Megtekintés miniatűr képként" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Törlés sikertelen" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-fájl. Küldés nem lehetséges" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Érvénytelen fájlnév" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximum mappaszám elérve" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Engedély megtagadva" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Sikertelen küldés" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "A célmappa a forrásmappa almappája" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "A fájl nem létezik" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nem lehet átmásolni" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nem helyezhető át" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Kevés a memória a telefonban. Töröljön néhány tételt, és próbálja újra" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "A másolás sikertelen." + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Az áthelyezés sikertelen" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Kevés a memória. A szabad memória %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Már van ilyen név" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nem lehet áthelyezni. A célmappa azonos a forrásmappával" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Mappát létrehoz" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Beilleszt ide" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Jelzések" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Háttérképek" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Képek" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videók" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Hangok" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Letöltések" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memória- kártya" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Külső tároló" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Szerkeszt" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Töröl" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Áthelyez" + +msgid "IDS_MF_BODY_UP" +msgstr "Fel" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Áthelyez ide" + +msgid "IDS_MF_SK3_COPY" +msgstr "Másol" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Rendezés szemp." + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Keres" + +msgid "IDS_MF_SK3_MORE" +msgstr "Egyebek" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Mappa létrehozása" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mappa neve" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Saját album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Megtekintés" + +msgid "IDS_MF_SK3_BACK" +msgstr "Vissza" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Saját videofelvételek" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Jogi státusz" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Szállító" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Számláló" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Tartalmazott elem" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Egyéni" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervallum" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Átnev." + +msgid "IDS_MF_BODY_TIME" +msgstr "Idő" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Időszámláló" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Típus" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Korlátlan" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Csere" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Hívó csengőhangja" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Név" + +msgid "IDS_MF_POP_COPIED" +msgstr "Átmásolva" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Semmi nincs kiválasztva" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Kevés a halommemória" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Kevés a memória. Töröljön néhány tételt" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Létrehozás dátuma" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-adatok" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-szélesség" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-hosszúság" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-verzió" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Részletek" + +msgid "IDS_MF_BODY_ANY" +msgstr "Bármely" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Lehetséges felhasználás" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Végrehajt" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Továbbítás" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nem lehetséges" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-adatok inicializálása..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Lehetséges" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Nyomtatás" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Érvényesség" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Új mappa" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Szerkeszt" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Rendezés" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Áthelyezés ide" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Tovább" + +msgid "IDS_MF_POP_COPYING" +msgstr "Másolás..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Beillesztés ide" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "A fájltípus\nnem támogatott" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Részletes nézet" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Növekvő" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Csökkenő" + +msgid "IDS_MF_TAB_ALL" +msgstr "Mind" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Ker. az összes mappában" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatűrnézet" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Fájlkiterjesztés megjelenítése" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Rendezés" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista és részletek" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "A mappanév már létezik." + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Kiterjesztés elrejtése" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Név (A-tól Z-ig)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Név (Z-től A-ig)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dátum (legújabb)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dátum (legrégebbi)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Saját fájlok megny." + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Csengőhangok" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nincs észlelt arc" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Kezdőképernyőre" + diff --git a/data/po/hy.po b/data/po/hy.po new file mode 100644 index 0000000..76b1287 --- /dev/null +++ b/data/po/hy.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Վեր" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Տուն" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ô´Õ«Õ¿Õ¥Õ¬ Õ¨Õ½Õ¿ ցանկի" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Ô´Õ«Õ¿Õ¥Õ¬ Õ¨Õ½Õ¿ մանրապատկերների" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Ջնջումը ձախողվեց" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM ֆայլ: Հնարավոր Õ¹Õ§ ուղարկել" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Անվավեր ֆայլի անուն" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Հասել եք թղթապանակների առավելագույն քանակի" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Թույլտվությունը մերժվեց" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Ուղարկման ձախողում" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Նշանակման Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ հանդիսանում Õ§ Õ½Õ¯Õ¦Õ¢Õ¶Õ¡Õ¯Õ¡Õ¶ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« Õ¥Õ¶Õ©Õ¡Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Ô±ÕµÕ½ ֆայլը գոյություն չունի" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Հնարավոր Õ¹Õ§ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Անհնար Õ§ տեղափոխել" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Բավարար Õ¿Õ¥Õ² Õ¹Õ¯Õ¡ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« հիշողության Õ´Õ¥Õ»: Վերացրեք որոշ տարրեր և նորից փորձեք" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Պատճենումը ձախողվեց" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Տեղափոխումը ձախողվեց" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Չկա Õ¢Õ¡Õ¾Õ¡Õ¯Õ¡Õ¶ հիշողություն: %s-Õ¨ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Նույն անունն արդեն օգտագործվում Õ§" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Հնարավոր Õ¹Õ§ տեղափոխել: Նշանակման Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ նույնն Õ§, Õ«Õ¶Õ¹ որ Õ½Õ¯Õ¦Õ¢Õ¶Õ¡Õ¯Õ¡Õ¶ Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ¨" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Ստեղծել Õ©Õ²Õ©ÕºÕ¡Õ¶Õ¡Õ¯" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Տեղադրել Õ¡ÕµÕ½Õ¿Õ¥Õ²" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Ազդանշաններ" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Պաստառներ" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Հեռախոս" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Պատկերներ" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Տեսահոլովակներ" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Ձայներ" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Բեռնումներ" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Հիշաքարտ" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Արտաքին պահոց" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Խմբագրել" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Ջնջել" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Տեղափխել" + +msgid "IDS_MF_BODY_UP" +msgstr "Վերև" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Տեղափոխել Õ¡ÕµÕ½Õ¿Õ¥Õ²" + +msgid "IDS_MF_SK3_COPY" +msgstr "Պատճենել" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Տեսակավորել Õ¨Õ½Õ¿" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Որոնում" + +msgid "IDS_MF_SK3_MORE" +msgstr "Ô±Õ¾Õ¥Õ¬Õ«" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Ստեղծել Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ô¹Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« անունը" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Ô»Õ´ Õ¡Õ¬Õ¢Õ¸Õ´Õ¨" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Ô´Õ«Õ¿Õ¥Õ¬ որպեսշ" + +msgid "IDS_MF_SK3_BACK" +msgstr "ՀԵՏ" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Ô»Õ´ ձայնահոլովակները" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Իրավունքի կարգավիճակ" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Մատակարար" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Քանակ" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Պարունակում Õ§" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Ô±Õ¶Õ°Õ¡Õ¿" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Դադար" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Վերանվ" + +msgid "IDS_MF_BODY_TIME" +msgstr "ÔºÕ¡Õ´Õ¡Õ¶Õ¡Õ¯" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Հաշվարկված Õ°Õ¡Õ·Õ«Õ¾" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Տեսակ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Անսահմանափակ" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Փխրնել" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Զանգահարողի Õ¦Õ¡Õ¶Õ£Õ« Õ´Õ¥Õ²Õ¥Õ¤Õ«" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Անուն" + +msgid "IDS_MF_POP_COPIED" +msgstr "Պատճենված Õ§" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ոչինչ ընտրված Õ¹Õ§" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Չկա Õ¢Õ¡Õ¾Õ¡Õ¯Õ¡Õ¶ Õ¦Õ¡Õ¶Õ£Õ¾Õ¡Õ®Õ¡ÕµÕ«Õ¶ հիշողություն" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Հիշողությունը Õ¹Õ« բավարարում: Ջնջեք որոշ տարրեր" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Ստեղծման Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Õ¨" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS տեղեկատվություն" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS լայնություն" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS երկայնություն" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS տարբերակ" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Մանրամսն." + +msgid "IDS_MF_BODY_ANY" +msgstr "Ցանկացած" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Հասանելի օգտվողներ" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Կատարել" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Փոխանցում" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Անհնար Õ§" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC տվյալներ Õ¥Õ¶ նախապատրաստվում..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Հնարավոր" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Տպել" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Վավերականություն" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Նոր Õ©Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Խմբագրել" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Թվարկել Õ¨Õ½Õ¿" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Տեղափոխել Õ¡ÕµÕ½Õ¿Õ¥Õ²" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Շարունակել" + +msgid "IDS_MF_POP_COPYING" +msgstr "Պատճենում Õ§..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Վերլուծել Õ¡ÕµÕ½Õ¿Õ¥Õ²" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Ֆայլի չսատարվող Õ¿Õ¥Õ½Õ¡Õ¯" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Մանրամասն դիտում" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ô±Õ³Õ¸Õ²" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Նվազող" + +msgid "IDS_MF_TAB_ALL" +msgstr "Բոլոր" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Որոնեք բոլոր թղթպնկները" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Փոքրացված պատկերների տեսք" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Ցույց Õ¿Õ¡Õ¬ ֆայլի ընդլայնումը" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Տեսակավորել Õ¨Õ½Õ¿" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Ցուցակ և մանրամասներ" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ô¹Õ²Õ©Õ¡ÕºÕ¡Õ¶Õ¡Õ¯Õ« անունն արդեն գոյություն ունի" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Թքցնլ ֆայլի ընդլայնում" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Անուն (Ô±-ից Ֆ)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Անուն (Ֆ-ից Ô±)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Ô±Õ´Õ½Õ¡Õ©Õ«Õ¾ (Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬ վերջին)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Ô±Õ´Õ½Õ¡Õ©Õ«Õ¾ (Õ¡Õ´Õ¥Õ¶Õ¡Õ°Õ«Õ¶)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ô³Õ¶Õ¡Õ¬ Ô»Õ´ Ֆայլերը" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Մեղեդիներ" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ոչ Õ´Õ« դեմք Õ¹Õ« Õ³Õ¡Õ¶Õ¡Õ¹Õ¾Õ¥Õ¬" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Ô±Õ¾. Õ°Õ«Õ´Õ¶. էկրնին" + diff --git a/data/po/is.po b/data/po/is.po new file mode 100644 index 0000000..6d02be8 --- /dev/null +++ b/data/po/is.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Upp" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Heima" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Birta lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Birta eftir smámyndum" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Ekki tókst að eyða" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM skrá. Ekki hægt að senda" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Ógilt skráarheiti" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Komið að hámarki möppu" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Leyfi var hafnað" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Sending mistókst" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Áfangamappa er undirmappa í upprunamöppunni" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Skráin er ekki til" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Mistókst að afrita" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ekki hægt að flytja" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Það er of lítið minni í símanum. Eyddu einhverjum hlutum og reyndu aftur" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Afritun mistókst" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Ekki tókst að flytja" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Ekki er nægt minni. %s tiltækt" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Þetta heiti er þegar í notkun" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ekki tókst að flytja. Áfangamappa sú sama og upprunamappa" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Búa til möppu" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Líma hér" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Áminningar" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Veggfóður" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Sími" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Myndir" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Myndskeið" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Hljóð" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Niðurhal" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Minnisk." + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Ytri geymsla" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Breyta" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eyða" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Flytja" + +msgid "IDS_MF_BODY_UP" +msgstr "Upp" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Færa hingað" + +msgid "IDS_MF_SK3_COPY" +msgstr "Afrita" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Raða eftir" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Leit" + +msgid "IDS_MF_SK3_MORE" +msgstr "Meira" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Búa til möppu" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Heiti möppu" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Albúm notanda" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Sjá sem" + +msgid "IDS_MF_SK3_BACK" +msgstr "BAKKA" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Myndskeiðin mín" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Rétt staða" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Seljandi" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Fjöldi" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Inniheldur" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Stakt" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Bil" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Endurn" + +msgid "IDS_MF_BODY_TIME" +msgstr "Tími" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Tímasett" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tegund" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Án takmarkana" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Skip. út" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Hringitónn hringjanda" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Heiti" + +msgid "IDS_MF_POP_COPIED" +msgstr "Afritað" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ekkert er valið" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Of lítið safnminni" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ekki er nægt minni. Eyðið nokkrum atriðum" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Búið til" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-upplýsingar" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-breiddargráða" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-lengdargráða" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-útgáfa" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Upplýsingar" + +msgid "IDS_MF_BODY_ANY" +msgstr "Hvað sem er" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Tiltæk notkun" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Framkvæma" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Framsending" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Ekki hægt" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-gögn ræsast..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mögulegt" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Prenta" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Gildistími" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ný mappa" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Breyta" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Raða eftir" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Færa hingað" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Halda áfram" + +msgid "IDS_MF_POP_COPYING" +msgstr "Afritun stendur yfir..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Líma hingað" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Óstutt skrársnið" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Upplýsingaskjár" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Hækkandi" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Lækkandi" + +msgid "IDS_MF_TAB_ALL" +msgstr "Allt" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Leita í öllum möppum" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Smámyndir" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Sýna skráargerð" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Raða eftir" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Listi og upplýsingar" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Sama skrárheiti er til fyrir" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Fela skráarendingu" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Heiti (A til Ö)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Heiti (Ö til A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dagsetning (nýjasta)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dagsetning (elsta)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Opna Skrárnar mínar" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Hringitónar" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ekkert andlit greindist" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Bæta á heimaskjá" + diff --git a/data/po/it_IT.po b/data/po/it_IT.po new file mode 100644 index 0000000..c3890e8 --- /dev/null +++ b/data/po/it_IT.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Su" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Home" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Visualizza elenco" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Visualizza miniature" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Eliminazione non riuscita" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "File DRM. Impossibile inviare" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nome file non valido" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Massimo cartella raggiunto" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permesso negato" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Impossibile inviare" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "La cartella di destinazione è una sottocartella della cartella di origine" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "File inesistente" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Impossibile copiare" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Impossibile spostare" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memoria insufficiente. Disinstallare alcuni elementi e riprovare" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Copia non eseguita" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Spostamento non riuscito" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Spazio insufficiente in memoria. %s disponibili" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Stesso nome già in uso" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Impossibile spostare. La cartella di destinazione coincide con la cartella di origine" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Crea cartella" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Incolla qui" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Avvisi" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Sfondi" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefono" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Immagini" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Suoni" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Download" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Scheda memoria" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Memoria esterna" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Modifica" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Elimina" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Sposta" + +msgid "IDS_MF_BODY_UP" +msgstr "Su" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Sposta qui" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copia" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordina per" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Cerca" + +msgid "IDS_MF_SK3_MORE" +msgstr "Altro" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Crea cartella" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nome cartella" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Visualizza come" + +msgid "IDS_MF_SK3_BACK" +msgstr "Indietro" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Video personali" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stato diritti" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Fornitore" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Conteggio" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Contiene" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuale" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervallo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Rinom." + +msgid "IDS_MF_BODY_TIME" +msgstr "Ora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "A termine" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Senza limitazioni" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Sostit." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Suoneria chiamante" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nome" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiato" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nessun elemento selezionato" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Memoria heap insufficiente" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memoria insufficiente. Eliminare alcuni elementi" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Data creazione" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informaz. GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitudine GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitudine GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versione GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Dettagli" + +msgid "IDS_MF_BODY_ANY" +msgstr "Qualsiasi" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Usi disponibili" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Esegui" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Inoltro" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossibile" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Inizializzazione dati MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possibile" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Stampa" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validità" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nuova cartella" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Modifica" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Elenca per" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Sposta qui" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continua" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copia..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Incolla qui" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo file non supportato" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista dettagli" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Crescente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Decrescente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Tutto" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Cerca in tutte le cartelle" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vista miniature" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostra estensione file" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordina per" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Elenco e dettagli" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nome cartella già esistente" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Nascondi estensione file" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nome (A - Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nome (Z - A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (Più recente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (Più vecchia)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Vai all'Archivio" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Suonerie" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nessun volto rilevato" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Aggiungi a Home" + diff --git a/data/po/ja_JP.po b/data/po/ja_JP.po new file mode 100644 index 0000000..65b1fae --- /dev/null +++ b/data/po/ja_JP.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "戻る" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "ホーム" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "リスト表示" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "サムネイル表示" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "削除できませんでした。" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRMファイルです。送信できません。" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "ファイル名が正しくありません。" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "最大フォルダ数に達しました。" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "承認が拒否されました。" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "送信に失敗しました" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "移動元と移動先のフォルダが同じです。" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "このファイルは存在しません。" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "コピーできません。" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "移動できません。" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "システムメモリ(本体)が不足しています。不要なアイテムを削除し、再度実行してください。" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "コピーに失敗しました。" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "移動に失敗しました。" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "メモリ不足です。%s使用可能" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "同じ名前が既に使用されています" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "移動できません。移動元と移動先のフォルダが同じです。" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "フォルダ作成" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "ここに貼付" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "通知" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "壁紙" + +msgid "IDS_MF_TAB_PHONE" +msgstr "本体" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "画像" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "動画" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "サウンド" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "ダウンロード" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "メモリカード" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "外部ストレージ" + +msgid "IDS_MF_SK3_EDIT" +msgstr "編集" + +msgid "IDS_MF_SK3_DELETE" +msgstr "削除" + +msgid "IDS_MF_SK3_MOVE" +msgstr "移動" + +msgid "IDS_MF_BODY_UP" +msgstr "上" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "ここに移動" + +msgid "IDS_MF_SK3_COPY" +msgstr "コピー" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "並べ替え" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "検索" + +msgid "IDS_MF_SK3_MORE" +msgstr "その他" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "フォルダ作成" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "フォルダ名" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "マイアルバム" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "表示形式" + +msgid "IDS_MF_SK3_BACK" +msgstr "戻る" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "マイビデオクリップ" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "権限の状態" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "提供元" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "回数" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "含む" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "個人" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "間隔" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "名称変更" + +msgid "IDS_MF_BODY_TIME" +msgstr "時刻" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "時間カウント" + +msgid "IDS_MF_BODY_TYPE" +msgstr "タイプ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "無制限" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "上書き" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "個別着信音" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "名前" + +msgid "IDS_MF_POP_COPIED" +msgstr "コピーしました。" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "何も選択されていません。" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "ヒープメモリ不足です。" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "メモリが不足しています。不要なアイテムを削除してください。" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "作成​された​データ" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS情報" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS緯度" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS経度" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPSバージョン" + +msgid "IDS_MF_SK_DETAILS" +msgstr "詳細" + +msgid "IDS_MF_BODY_ANY" +msgstr "どれか" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "使用可能" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "実行" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "転送" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "不可" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC​データ​を​インストール中..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "可能" + +msgid "IDS_MF_BODY_PRINT" +msgstr "印刷" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "有効回数" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "新規フォルダ" + +msgid "IDS_MF_OPT_EDIT" +msgstr "編集" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "ソート" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "ここに移動" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "次へ" + +msgid "IDS_MF_POP_COPYING" +msgstr "コピー中..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "ここにコピー" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "未対応のファイルです。" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "詳細表示" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "昇順" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "降順" + +msgid "IDS_MF_TAB_ALL" +msgstr "全て" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "全てのフォルダを検索" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "サムネイル表示" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "ファイル拡張子を表示" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "ソート" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "リストおよび詳細" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "このフォルダ名は既に使用されています。" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "ファイル拡張子を非表示" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "名前(A~Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "名前(Z~A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "日付(新しい順)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "日付(古い順)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "マイ​ファイル​に​移動" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "着信音" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "顔が検出されません。" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "ホームに追加" + diff --git a/data/po/ka.po b/data/po/ka.po new file mode 100644 index 0000000..d8549f7 --- /dev/null +++ b/data/po/ka.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "ზევით" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "საწყისი გვერდი" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "დათვალიერება სიით" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "დათვალიერება პიქტოგრამებით" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "წაშლა არ მოხერხდა" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM ფაილი. ვერ გაგზავნით" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "ფაილის არასწორი დასახელება" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "საქაღალდეების რაოდენობამ მაქსიმუმს მიაღწია" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "ნებართვა უარყოფილია" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "ვერ გაიგზავნა" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "საბოლოო საქაღალდე დევს საწყის საქაღალდეში" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "ფაილი არ არსებობს" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "ვერ დაკოპირდება" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "ვერ გადაადგილდება" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "ტელეფონში არ არის საკმარისი მეხსიერება. წაშალეთ ზოგიერთი ელემენტი და ისევ ცადეთ" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "გადაწერა არ მოხერხდა" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "გადატანა ვერ შესრულდა" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "მეხსიერება არ არის საკმარისი. დარჩენილია %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "იგივე სახელი უკვე გამოყენებულია" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "ვერ გადაიტანთ. საბოლოო და საწყისი საქაღალდეები ერთიდაიგივეა" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "საქაღალდის შექმნა" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "ჩასვით აქ" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "სიგნალები" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "ფონები" + +msgid "IDS_MF_TAB_PHONE" +msgstr "ტელეფონი" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "გამოსახულებები" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "ვიდეოები" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "ხმები" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "გადმოწერილები" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "მეხსიერ. ბარათი" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "გარე მეხსიერება" + +msgid "IDS_MF_SK3_EDIT" +msgstr "რედაქტირება" + +msgid "IDS_MF_SK3_DELETE" +msgstr "წაშლა" + +msgid "IDS_MF_SK3_MOVE" +msgstr "გადატანა" + +msgid "IDS_MF_BODY_UP" +msgstr "ზემოთ" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "გადაიტანეთ აქ" + +msgid "IDS_MF_SK3_COPY" +msgstr "ასლი" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "დალაგება" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "ძიება" + +msgid "IDS_MF_SK3_MORE" +msgstr "სხვა" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "შექმენი საქაღალდე" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "საქაღალდის სახელი" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "ჩემი ალბომი" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "დათვალიერება როგორც" + +msgid "IDS_MF_SK3_BACK" +msgstr "უკან" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "ჩემი ვიდეოკლიპები" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "ნამდვილი სტატუსი" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "მომწოდებელი" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "დათვლა" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "შეიცავს" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "ინდივიდუალური" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "ინტერვალი" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "გდრქმ." + +msgid "IDS_MF_BODY_TIME" +msgstr "დრო" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "შეყოვნებული დათვლა" + +msgid "IDS_MF_BODY_TYPE" +msgstr "ტიპი" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "შეუზღუდავი" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "შეცვლა" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "აბონენტის ზარის მელოდია" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "სახელი" + +msgid "IDS_MF_POP_COPIED" +msgstr "დაკოპირდა" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "არაფერია არჩეული" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "არ არის საკმარისი მასიური მეხსიერება" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "მეხსიერება საკმარისი არაა. წაშალეთ ზოგიერთი ელემენტი" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "შექმნილი მონაცემები" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS ინფორმაცია" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS განედი" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS გრძედი" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS ვერსია" + +msgid "IDS_MF_SK_DETAILS" +msgstr "დეტალები" + +msgid "IDS_MF_BODY_ANY" +msgstr "ნებისმიერი" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "დასაშვები გამოყენება" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "შესრულება" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "გადამისამართება" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "შეუძლებელია" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "სრულდება MMC მონაცემთა ინიციალიზაცია..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "შესაძლო" + +msgid "IDS_MF_BODY_PRINT" +msgstr "ამობეჭდვა" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "ქმედითობა" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "ახალი საქაღალდე" + +msgid "IDS_MF_OPT_EDIT" +msgstr "შეცვლა" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "ჩამონათვალი პარამეტრით" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "გადმოტანა" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "გაგრძელება" + +msgid "IDS_MF_POP_COPYING" +msgstr "კოპირდება..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "აქ ჩასვით" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "ფაილის ტიპი გაუთვალისწინებელია" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "დეტალური დათვალიერება" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "ზრდადი" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "კლებადი" + +msgid "IDS_MF_TAB_ALL" +msgstr "ყველა" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "ყველა საქაღალდის ძებნა" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "მიკროასლების ნახვა" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "ჩანდეს ფაილის გაფართოება" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "გადარჩევა" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "სია და დეტალები" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "საქაღალდის სახელი უკვე არსებობს" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "გაფართოების დამალვა" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "სახელი (ა-დან ჰ-მდე)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "სახელი (ჰ-დან ა-მდე)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "თარიღი (უახლესი)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "თარიღი (ყველაზე ძველი)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "ჩემს ფაილებზე გადას." + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "ზარის მელოდიები" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "სახე არ არის დადგენილი" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "დაამატე საწყისზე" + diff --git a/data/po/kk.po b/data/po/kk.po new file mode 100644 index 0000000..31081ea --- /dev/null +++ b/data/po/kk.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Жоғары" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Үй парағы" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Тізімді қарап шығу" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Нұсқадан көру" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Жою үстінде үзіліп кетті" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM файлы. Жіберу мүмкін емес" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Файлдың аты қате" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Қапшықтар ең көп саны артты" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Рұқсаттан бас тартылды" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Жіберудің сәті түспеді" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Тағайындау қалтасы кіріс қалтасына салынған болып табылады" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Файл жоқ" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Көшіру мүмкін емес" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Жылжытуға мүмкіндік жоқ" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Телефон жадында жад жеткілікті емес. Біраз элементті жойып, қайталап көріңіз" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Көшірілу үзіліп кетті" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Орналастырылмады" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Жадында орын жетіспейді. %s бар" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Мұндай атау қолданыста бар" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Жылжытылмайды.Мақсатты қалта бастапқы қалтамен бірдей" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Қалта жасау" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Осында қою" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Дабыл қағу" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Түсқағаз" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Телефон" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Суреттер" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Бейнежазбалар" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Дыбыстар" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Жазылған" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Жад картасы" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Сыртқы жад" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Өзгер." + +msgid "IDS_MF_SK3_DELETE" +msgstr "Жою" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Ауыстыру" + +msgid "IDS_MF_BODY_UP" +msgstr "Жоғары" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Осында ауыстыру" + +msgid "IDS_MF_SK3_COPY" +msgstr "Көшіру" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Сұрыптау" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Тізім" + +msgid "IDS_MF_SK3_MORE" +msgstr "Қосымша" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Қалтаны құру" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Папка аты" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Альбомым" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "түрінде көру" + +msgid "IDS_MF_SK3_BACK" +msgstr "АРТҚА" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Бейне жазбалар" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Құқық мәртебесі" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Сатушы" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Санау" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Мазмұны" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Жеке" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Аралық" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Ат өзг" + +msgid "IDS_MF_BODY_TIME" +msgstr "Уақыт" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Уақытпен санау" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Түрі" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Шектеусіз" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Ауыстыру" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Телефон шалушы әуені" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Аты" + +msgid "IDS_MF_POP_COPIED" +msgstr "Хабар(лар) көшірілді" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ештенке таңдалмады" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Динамикалық жадта орын жеткіліксіз" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Жад жетыспейт.Көп арналы жою." + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Жасалған күн" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS ақпараты" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS ендігі" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS бойлығы" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS түрі" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Егж.-тег." + +msgid "IDS_MF_BODY_ANY" +msgstr "Кез келген" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Пайдалануға жарамды" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Орындау" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Басқа біреуге жіберу" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Мүмкін емес" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC деректері басталуда..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Мүмкін" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Басып шығару" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Жарамдылық" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Жаңа қалта" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Өзгерту" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Іріктеу" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Осында ауыстыру" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Жалғастыру" + +msgid "IDS_MF_POP_COPYING" +msgstr "Көшірілуде..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Осында енгізу" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Қолдаусыз файл түрі" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Мәліметтер көрінісі" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Өсу" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Кему" + +msgid "IDS_MF_TAB_ALL" +msgstr "Барлығы" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Барлық қалталарды іздеу" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Нобай көрінісі" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Файл кеңейтімін көрсету" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Бойынша сұрыптау" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Тізім және мәліметтер" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Қалтаның аты бар" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Файл кеңейтімін жасыру" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Аты (A-дан Я-ға дейін)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Аты (Я-дан А-ға дейін)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Күні (Ең соңғы)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Күні (Ең алдыңғы)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Менің файлдарыма өту" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Әуендер" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Бетті көрсетуге болмайды" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Баст. бетке қосу" + diff --git a/data/po/ko_KR.po b/data/po/ko_KR.po new file mode 100644 index 0000000..e2e4572 --- /dev/null +++ b/data/po/ko_KR.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "위로" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "홈" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "목록 보기" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "썸네일 보기" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "삭제하지 못하였습니다" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM 파일은 전송할 수 없습니다" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "파일 이름이 바르지 않습니다" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "최대 폴더 수를 초과하였습니다" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "허가가 거부되었습니다" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "전송하지 못하였습니다" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "대상 폴더가 현재 폴더의 하위 폴더입니다" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "파일이 존재하지 않습니다" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "복사할 수 없습니다" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "이동시킬 수 없습니다" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "내장 메모리에 저장 공간이 부족합니다. 일부 항목을 삭제한 후 다시 시도하세요" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "복사하지 못하였습니다" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "이동하지 못하였습니다" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "메모리가 부족합니다. %s을(를) 사용할 수 있습니다" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "사용 중인 이름입니다" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "이동시킬 수 없습니다. 소스 폴더와 이름이 같습니다" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "폴더 추가" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "여기로 복사" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "알림" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "배경화면" + +msgid "IDS_MF_TAB_PHONE" +msgstr "휴대폰" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "이미지" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "동영상" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "사운드" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "다운로드 관리" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "메모리 카드" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "외장 메모리" + +msgid "IDS_MF_SK3_EDIT" +msgstr "편집" + +msgid "IDS_MF_SK3_DELETE" +msgstr "삭제" + +msgid "IDS_MF_SK3_MOVE" +msgstr "이동" + +msgid "IDS_MF_BODY_UP" +msgstr "상위" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "여기로 이동" + +msgid "IDS_MF_SK3_COPY" +msgstr "복사" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "정렬" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "검색" + +msgid "IDS_MF_SK3_MORE" +msgstr "더보기" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "폴더 추가" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "폴더 이름" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "내 앨범" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "보기 방식" + +msgid "IDS_MF_SK3_BACK" +msgstr "이전" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "내 동영상" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "권한 유효 상태" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "판매자" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "횟수" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "포함" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "개인" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "간격" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "이름 변경" + +msgid "IDS_MF_BODY_TIME" +msgstr "시간" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "시간 경과 후 횟수 계산" + +msgid "IDS_MF_BODY_TYPE" +msgstr "형식" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "제한 없음" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "교체" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "개인 벨소리" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "이름" + +msgid "IDS_MF_POP_COPIED" +msgstr "복사되었습니다" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "선택된 것이 없습니다" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "힙메모리가 부족합니다" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "저장 공간이 없습니다. 필요 없는 파일을 삭제하세요" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "생성 날짜" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS 정보" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS 위도" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS 경도" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS 버전" + +msgid "IDS_MF_SK_DETAILS" +msgstr "상세 정보" + +msgid "IDS_MF_BODY_ANY" +msgstr "모든 종류" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "사용 가능" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "실행" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "전송" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "불가능" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "메모리 카드 데이터 초기화 중…" + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "가능" + +msgid "IDS_MF_BODY_PRINT" +msgstr "인쇄" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "유효 횟수" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "새 폴더" + +msgid "IDS_MF_OPT_EDIT" +msgstr "편집" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "정렬" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "여기로 이동" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "계속" + +msgid "IDS_MF_POP_COPYING" +msgstr "복사 중..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "여기로 복사" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "지원되지 않는 파일 형식입니다" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "상세정보 보기" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "오름차순" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "내림차순" + +msgid "IDS_MF_TAB_ALL" +msgstr "모두" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "모든 폴더 검색" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "썸네일 보기" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "파일 확장자 보기" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "정렬" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "목록 및 상세 정보" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "사용 중인 폴더 이름입니다" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "파일 확장자 숨기기" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "이름(가나다순)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "이름(가나다역순)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "날짜(최신순)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "날짜(오래된순)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "내 파일로 이동" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "벨소리" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "인식된 얼굴이 없습니다" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "홈에 추가" + diff --git a/data/po/lt.po b/data/po/lt.po new file mode 100644 index 0000000..7e3e239 --- /dev/null +++ b/data/po/lt.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Ä® viršų" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Pradž." + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "PeržiÅ«rėti pagal sąrašą" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "ŽiÅ«rėti miniatiÅ«ras" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "IÅ¡trinti nepavyko" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM failas. Negalima siųsti" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neleistinas failo pavadinimas" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Pasiektas maksimalus aplankų skaičius" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Leidimas atmestas" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "IÅ¡siųsti nepavyko" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Paskirties aplankas yra vidinis originaliojo aplanko aplankas" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Tokio failo nėra" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Negalima kopijuoti" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Negalima perkelti" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nepakanka atminties telefone. IÅ¡trinkite kai kuriuos elementus ir bandykite dar kartą" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Perkelti nepavyko" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Perkelti nepavyko" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nepakanka atminties. Liko %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Toks pavadinimas jau yra" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Neįmanoma perkelti. Paskirties aplankas yra toks pat kaip ir originalus aplankas" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Kurti aplanką" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Ä®klijuoti čia" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Perspėjimai" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Ekrano fonai" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefonas" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Vaizdai" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vaizdo įraÅ¡ai" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Garsai" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Atsisiųsti elem." + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Atminties kort." + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "IÅ¡orinė laikmena" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Redaguoti" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Trinti" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Perkelti" + +msgid "IDS_MF_BODY_UP" +msgstr "AukÅ¡tyn" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Perkelti čia" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopijuoti" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "RÅ«Å¡iuoti pagal" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "IeÅ¡koti" + +msgid "IDS_MF_SK3_MORE" +msgstr "Daugiau" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Kurti aplanką" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Aplanko pavadinimas" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mano albumas" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "PeržiÅ«rėti kaip" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atgal" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mano vaizdo įraÅ¡ai" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Teisių bÅ«sena" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Tiekėjas" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Skaičiuoti" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Yra" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Atskiras" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalas" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Perv." + +msgid "IDS_MF_BODY_TIME" +msgstr "Laikas" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Laiko skaičiavimas" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipas" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neribota" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Pakeisti" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Skambintojo skambėjimo tonas" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Pavadinimas" + +msgid "IDS_MF_POP_COPIED" +msgstr "Nukopijuota" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Niekas nepasirinkta" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nepakanka kaupiamosios atminties" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nepakanka atminties. IÅ¡trinkite kai kuriuos elementus" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Sukurta data" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informacija" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS platuma" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS ilguma" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS versija" + +msgid "IDS_MF_SK_DETAILS" +msgstr "IÅ¡sami informacija" + +msgid "IDS_MF_BODY_ANY" +msgstr "Bet kuris" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Galimi panaudojimai" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Vykdyti" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Persiuntimas" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Neįmanoma" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Inicijuojami MMC duomenys..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Ä®manoma" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Spausdinti" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Galiojimas" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Naujas aplankas" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Redaguoti" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "RÅ«Å¡iuoti pagal" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Perkelti čia" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Tęsti" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopijuojama..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Ä®klijuoti čia" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepalaikomas failo tipas" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detalus rodinys" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Didėjimo tvarka" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Mažėjimo tvarka" + +msgid "IDS_MF_TAB_ALL" +msgstr "Visi" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "IeÅ¡koti visų aplankų" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "MiniatiÅ«rų rodinys" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Rodyti failo plėtinį" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "RÅ«Å¡iuoti pagal" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "SąraÅ¡as ir iÅ¡sami inf." + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Toks aplanko pavadinimas jau yra" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Slėpti failo plėtinį" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Pavadinimas (A–Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Pavadinimas (Z–A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (naujausi)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (seniausi)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Eiti į „Mano failus“" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Skambėjimo tonai" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Veidas neaptiktas" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Ä®d. į pradž.psl." + diff --git a/data/po/lv.po b/data/po/lv.po new file mode 100644 index 0000000..fc7e8d7 --- /dev/null +++ b/data/po/lv.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Uz augÅ¡u" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Mājas" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "SkatÄ«t pēc saraksta" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "SkatÄ«t sÄ«ktēlus" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Neizdevās izdzēst" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM fails. Nevar nosÅ«tÄ«t" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "NederÄ«gs faila nosaukums" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Sasniegts maksimālais mapes skaits" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Atļauja liegta" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Neizdevās nosÅ«tÄ«t" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "MērÄ·a mape ir avota mapes apakÅ¡mape" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Šāda faila nav." + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nevar kopēt" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nevar pārvietot" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Tālruņa atmiņā nepietiek vietas. Izdzēsiet dažus objektus un mēģiniet vēlreiz" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Neizdevās kopēt" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "PārvietoÅ¡ana neizdevās" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nepietiek atmiņas. Pieejamā atmiņa: %s." + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Šāds nosaukums jau tiek lietots" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nevar pārvietot. MērÄ·a mape ir tāda pati kā avota mape" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Izveidot mapi" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "IelÄ«mēt Å¡eit" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "BrÄ«dinājumi" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fona attēli" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Tālrunis" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Attēli" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Skaņas" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Lejupielādes" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Atmiņas karte" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Ārējā krātuve" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Rediģēt" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Dzēst" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Pārvietot" + +msgid "IDS_MF_BODY_UP" +msgstr "Uz augÅ¡u" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Pārvietot Å¡eit" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopēt" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Kārtot pēc" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Meklēt" + +msgid "IDS_MF_SK3_MORE" +msgstr "Citi" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Izveidot mapi" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mapes nosaukums" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mans albums" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "SkatÄ«t kā" + +msgid "IDS_MF_SK3_BACK" +msgstr "Atpakaļ" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mani videoklipi" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Pareizais statuss" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Piegādātājs" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Skaits" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Ietver" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuāls" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervāls" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Pārd." + +msgid "IDS_MF_BODY_TIME" +msgstr "Laiks" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Skaits ar laika uzskaiti" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Veids" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neierobežots" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Aizstāt" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "ZvanÄ«tāja zvana signāls" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nosaukums" + +msgid "IDS_MF_POP_COPIED" +msgstr "Nokopēts" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nekas nav izvēlēts" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nepietiekama sistēmas atmiņa" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nepietiek atmiņas. Izdzēsiet dažus vienumus" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "IzveidoÅ¡anas datums" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informācija" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS Ä£eogrāfiskais platums" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS Ä£eogrāfiskais garums" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS versija" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Dati" + +msgid "IDS_MF_BODY_ANY" +msgstr "JebkurÅ¡" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Atlikušās lietoÅ¡anas reizes" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "IzpildÄ«t" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "PārsÅ«tÄ«Å¡ana" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nav iespējams" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Tiek inicializēti MMC dati..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Iespējams" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Drukāt" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "DerÄ«gums" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Jauna mape" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Rediģēt" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Kārtot pēc" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Pārvietot Å¡eit" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Turpināt" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopē..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "IelÄ«mēt Å¡eit" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "NeatbalstÄ«ts faila veids" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detalizēts skats" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Augošā secÄ«bā" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Dilstošā secÄ«bā" + +msgid "IDS_MF_TAB_ALL" +msgstr "Visas" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Meklēt visās mapēs" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "SÄ«ktēlu skats" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "RādÄ«t faila paplaÅ¡inājumu" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Kārtot pēc" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Saraksts un dati" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Mapes nosaukums jau pastāv" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Slēpt faila paplaÅ¡." + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nosaukums (no A lÄ«dz Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nosaukums (no Z lÄ«dz A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datums (jaunākais)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datums (vecākais)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Atv.mapi Mani faili" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Zvana signāli" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Neviena seja nav noteikta" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Pievien. sākumam" + diff --git a/data/po/mk.po b/data/po/mk.po new file mode 100644 index 0000000..22c6265 --- /dev/null +++ b/data/po/mk.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Горе" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Дома" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Прегледај по листата" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Прегледај по сликички" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Неуспешно бришење" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Заштитен фајл. Не може да се прати" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Неправилно име на фајл" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Достигнат е максималниот број папки" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Нема дозвола" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Неуспешно праќање" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Одредишната папка е под-папка на изворната" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Фајлот не постои." + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Не може да се копира" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Не може да се премести" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Нема доволно меморија во меморијата на телефонот. Избришете некој запис и обидете се повторно" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Неуспешно копирање" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Неуспешно преместување" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Нема доволно меморија. Достапни се %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Истото име веќе се користи" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Не може да се премести. Одредишната папка е иста како и изворната" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Нова папка" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Пресликај тука" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Известувања" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Заднини" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Телефон" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Слики" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Видео-записи" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Звуци" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Преземено" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Мем. картичка" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Надворешен мем. уред" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Измени" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Избриши" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Премести" + +msgid "IDS_MF_BODY_UP" +msgstr "Отворање" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Премести тука" + +msgid "IDS_MF_SK3_COPY" +msgstr "Копирај" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Подреди според" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Пребарај" + +msgid "IDS_MF_SK3_MORE" +msgstr "Повеќе" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Направи папка" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Име на папката" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Мој албум" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Прикажи како" + +msgid "IDS_MF_SK3_BACK" +msgstr "НАЗАД" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Мои видео-записи" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Состојба на правата" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Продавач" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Број" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Содржи" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Индивидуално" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Интервал" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Преим." + +msgid "IDS_MF_BODY_TIME" +msgstr "Време" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Временско користење" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Тип" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Неограничено" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Замени" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Тон за повикувач" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Име" + +msgid "IDS_MF_POP_COPIED" +msgstr "Копирано" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Не е избрано ништо" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Нема доволно меморија." + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Нема доволно меморија. Избришете некој запис" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Датум на создавање:" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Информации за GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS географска широчина" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS географска должина" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-верзија" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Детали" + +msgid "IDS_MF_BODY_ANY" +msgstr "Кој било" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Можност за употреба" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Изврши" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Препраќање" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Невозможно" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Податоците за MMC се активираат..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Возможно" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Печати" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Валидност" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Нова папка" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Измени" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Подреди според" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Премести тука" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Продолжи" + +msgid "IDS_MF_POP_COPYING" +msgstr "Се копира..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Пресликај тука" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Неподдржан тип на фајл" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Детален преглед" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Нагорен редослед" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Надолен редослед" + +msgid "IDS_MF_TAB_ALL" +msgstr "Сите" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Пребарај ги сите папки" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Икони" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Прикажи наставки на фајловите" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Подреди според" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Листа со детали" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Името на папката веќе постои" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Сокриј наст. на фајл" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Име (од А до Ш)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Име (од Ш до А)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Датум (Најнов)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Датум (Најстар)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Оди во Мои фајлови" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Тонови на ѕвонење" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Не е откриено лице" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Додај дома" + diff --git a/data/po/nb.po b/data/po/nb.po new file mode 100644 index 0000000..d3039ba --- /dev/null +++ b/data/po/nb.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Opp" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Hjem" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Vis etter liste" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Vis etter miniatyr" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Kunne ikke slette" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-fil. Kan ikke sende" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Ugyldig filnavn" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Det maksimale antall mapper er nÃ¥dd" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Tillatelse avslÃ¥tt" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Sendingen mislyktes" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "MÃ¥lmappen er en undermappe til kildemappen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Filen eksisterer ikke" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Kan ikke kopiere" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Kan ikke flytte" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Ikke nok minne i telefonminnet. Slett noen elementer og prøv pÃ¥ nytt" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kunne ikke kopiere" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Flyttingen mislyktes" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Ikke tilstreklig med minne. %s er ledig" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Samme navn allerede i bruk" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Kan ikke flytte. MÃ¥lmappen er den samme som kildemappen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Lag mappe" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Lim inn her" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Varsler" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Bakgrunn" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Bilder" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videoklipp" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Lyder" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Nedlastinger" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Minnekort" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Ekstern lagring" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Rediger" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Slett" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Flytt" + +msgid "IDS_MF_BODY_UP" +msgstr "Opp" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Flytt hit" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopier" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sorter etter" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Søk" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mer" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Opprett mappe" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mappenavn" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mitt album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Vis som" + +msgid "IDS_MF_SK3_BACK" +msgstr "Tilbake" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mine videoklipp" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Rettighetsstatus" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Leverandør" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Antall" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Inneholder" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuell" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervall" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Endre navn" + +msgid "IDS_MF_BODY_TIME" +msgstr "Tid" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Gjenværende tid" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ubegrenset" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Erstatt" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Anropsringetone" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Navn" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopiert" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ingenting valgt" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Ikke nok frilagerminne" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ikke nok minne. Slett noen elementer" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Opprettingsdato" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-informasjon" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-breddegrad" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-lengdegrad" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-versjon" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detaljer" + +msgid "IDS_MF_BODY_ANY" +msgstr "Alle" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Kan brukes antall ganger" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Utfør" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Videresending" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Umulig" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-data initialiserer..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mulig" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Skriv ut" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Gyldighet" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ny mappe" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Rediger" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sorter etter" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Flytt hit" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Fortsett" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopierer..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Lim inn her" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Filtypen støttes ikke" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detaljvisning" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Stigende" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Synkende" + +msgid "IDS_MF_TAB_ALL" +msgstr "Alle" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Søk i alle mapper" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatyrvisning" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Vis filendelse" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sorter etter" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste og detaljer" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Mappenavnet finnes allerede" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Skjul filendelse" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Navn (A til Å)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Navn (Å til A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dato (nyeste)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dato (eldste)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "GÃ¥ til Mine Filer" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringetoner" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Ingen ansikter gjenkjent" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Legg pÃ¥ startskj" + diff --git a/data/po/nl_NL.po b/data/po/nl_NL.po new file mode 100644 index 0000000..3953207 --- /dev/null +++ b/data/po/nl_NL.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Omhoog" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Startpagina" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Lijstweergave" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Miniatuurweergave" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Verwijderen mislukt" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-bestand. Kan niet verzonden worden" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Ongeldige bestandsnaam" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maximum aantal mappen bereikt" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Toestemming geweigerd" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Verzenden mislukt" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "De doelmap is een submap van de bronmap" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Dit bestand bestaat niet" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Kan niet kopiëren" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Kan niet verplaatsen" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Onvoldoende ruimte in telefoongeheugen. Verwijder een aantal items en probeer het opnieuw" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiëren is mislukt" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Verplaatsen is mislukt" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Onvoldoende geheugen. %s beschikbaar" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Naam is al in gebruik" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Kan niet verplaatsen. Doelmap zelfde als bronmap" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Map maken" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Hier kopiëren" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Waarschuwingen" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Achtergronden" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefoon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Afbeeldingen" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video's" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Geluiden" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Geheugen-\nkaart" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Externe opslag" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Wijzigen" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Wissen" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Verplaatsen" + +msgid "IDS_MF_BODY_UP" +msgstr "Omhoog" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Hier plaatsen" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiëren" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sorteren op" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Zoeken" + +msgid "IDS_MF_SK3_MORE" +msgstr "Meer" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Map maken" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mapnaam" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mijn album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Tonen als" + +msgid "IDS_MF_SK3_BACK" +msgstr "Terug" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mijn videoclips" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Status rechten" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Leverancier" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Aantal" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Bevat" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individueel" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Wijzig" + +msgid "IDS_MF_BODY_TIME" +msgstr "Tijd" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Speelduur" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Type" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Onbeperkt" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Vervang" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Beltoon beller" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Naam" + +msgid "IDS_MF_POP_COPIED" +msgstr "Gekopieerd" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Niets geselecteerd" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Onvoldoende heap-geheugen" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Onvoldoende geheugen. Wis een aantal items" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Aanmaakdatum" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informatie" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-breedtegraad" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-lengtegraad" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-versie" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Gegevens" + +msgid "IDS_MF_BODY_ANY" +msgstr "Alle" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Aantal keer dat het gebruikt mag worden" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Uitvoeren" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Doorsturen" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Niet mogelijk" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-gegevens worden geïnitialiseerd..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mogelijk" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Afdrukken" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Geldigheid" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nieuwe map" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Bewerken" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sorteren op" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Hier plaatsen" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Doorgaan" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiëren..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Hier kopiëren" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Niet-ondersteund bestandstype" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detailweergave" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Oplopend" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Aflopend" + +msgid "IDS_MF_TAB_ALL" +msgstr "Alles" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Zoeken in alle mappen" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatuurweergave" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Bestandsextensie weergeven" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sorteren op" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lijst en details" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Mapnaam bestaat al" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Bestandsext. verbergen" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Naam (A tot Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Naam (Z tot A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (meest recent)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (oudste)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Naar Mijn bestanden" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Beltonen" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Geen gezicht gedetecteerd" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Toev aan startpg" + diff --git a/data/po/pl.po b/data/po/pl.po new file mode 100644 index 0000000..4ec8a30 --- /dev/null +++ b/data/po/pl.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Góra" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Ekran główny" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Sortuj wg listy" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Sortuj wg miniatur" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Błąd usuwania" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Plik DRM. Nie można wysłać" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nieprawidłowa nazwa pliku" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Osiągnięto maksymalną wielkość katalogu" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Nie udzielono zezwolenia" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Błąd wysyłania" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Katalog docelowy jest podkatalogiem katalogu źródłowego" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Plik nie istnieje" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nie można skopiować" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nie można przenieść" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Za mało pamięci w telefonie. Usuń niektóre elementy i spróbuj ponownie" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Błąd kopiowania" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Błąd przenoszenia" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Brak pamięci. Dostępne: %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ta sama nazwa jest już w użyciu" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nie można przenieść. Katalog docelowy taki sam jak katalog źródłowy" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Utwórz katalog" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Wklej tutaj" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alarmy" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Tapety" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Obrazy" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Filmy" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Dźwięki" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Pobrane" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Karta pamięci" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Pamięć zewnętrzna" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Edytuj" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Usuń" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Przenieś" + +msgid "IDS_MF_BODY_UP" +msgstr "W górę" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Przenieś tutaj" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiuj pozycję" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortuj według" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Szukaj" + +msgid "IDS_MF_SK3_MORE" +msgstr "Więcej" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Utwórz katalog" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nazwa katalogu" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mój album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Wyświetl jako" + +msgid "IDS_MF_SK3_BACK" +msgstr "Wstecz" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moje wideoklipy" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Status uprawnienia" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Dostawca" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Liczba" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Zawiera" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Osobiste" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Okres" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Zm.naz." + +msgid "IDS_MF_BODY_TIME" +msgstr "Godzina" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Licznik synchronizowany" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Typ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Nieograniczony" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Zamień" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Dzwonek kontaktu" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nazwa" + +msgid "IDS_MF_POP_COPIED" +msgstr "Skopiowano" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Niczego nie zaznaczono" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Brak pamięci heap" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Brak pamięci. Usuń niektóre elementy" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Data utworzenia" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informacje GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Szerokość geograficzna GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Długość geograficzna GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Wersja GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Szczegóły" + +msgid "IDS_MF_BODY_ANY" +msgstr "Dowolny" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Dostępne zastosowania" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Wykonaj" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Przesyłanie" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Niemożliwe" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Trwa inicjowanie karty pamięci..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Możliwe" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Drukuj" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Ważność" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nowy katalog" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Edytuj" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sortuj wg" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Przenieś tutaj" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Kontynuuj" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiowanie..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Wklej tutaj" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nieobsługiwany typ pliku" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Wyświetlanie szczegółów" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Rosnąco" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Malejąco" + +msgid "IDS_MF_TAB_ALL" +msgstr "Wszystkie" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Przesz. wszystkie kat." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatury" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Pokaż rozszerzenia plików" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortuj wg" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista i szczegóły" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nazwa katalogu już istnieje" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ukryj rozszerz. plików" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nazwa (od A do Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nazwa (od Z do A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (od najnowszych)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (od najstarszych)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Idź do Moich plików" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Dzwonki" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nie wykryto twarzy" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Dod.do ekr.start" + diff --git a/data/po/pt_BR.po b/data/po/pt_BR.po new file mode 100644 index 0000000..6250f91 --- /dev/null +++ b/data/po/pt_BR.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Para cima" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Início" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Visualizar por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Visualizar por miniatura" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Erro ao apagar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Arquivo DRM. Impossível enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nome de arquivo\ninválido" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Número máximo de pasta atingido" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permissão negada" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Erro ao enviar" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "A pasta de destino é uma subpasta da pasta de origem" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Este arquivo não existe" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Impossível copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Impossível mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memória insuficiente no telefone. Apague alguns itens e tente novamente" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Erro ao copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Erro ao mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Memória insuficiente. %s disponível" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "O mesmo nome já está sendo utilizado" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Impossível mover. Pasta de destino é a mesma do arquivo de origem" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Criar pasta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Colar aqui" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Papéis de parede" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imagens" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Tons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Downloads" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Cartão de memória" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Armazenamento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Apagar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Para cima" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover para cá" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Procurar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mais" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Criar pasta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nome da pasta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Meu álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Visualizar como" + +msgid "IDS_MF_SK3_BACK" +msgstr "Voltar" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Meus vídeos" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Status de direitos" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Fornecedor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Contagem" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Conteúdo" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Renom." + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Contagem temporizada" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitado" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Substit." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Toque para um contato" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nome" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nada selecionado" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Memória de pilha insuficiente" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memória insuficiente. Apague alguns itens" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Criado na data" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informações de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitude GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitude GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versão GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalhes" + +msgid "IDS_MF_BODY_ANY" +msgstr "Qualquer" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Utilizações disponíveis" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Executar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Encaminhamento" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossível" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Os dados MMC estão sendo iniciados..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possível" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validade" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nova pasta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover para cá" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiando..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Colar aqui" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de arquivo não suportado" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Visualização de detalhes" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Crescente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Todos" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Pesq. todas as pastas" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Ver por miniaturas" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Exibir extensão do arquivo" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista e detalhes" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nome de pasta já existente" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar ext. arquivo" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nome (De A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nome (De Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (mais recente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (mais antiga)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir p/ Meus Arquivos" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Toques" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nenhum rosto detectado" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Adic. ao início" + diff --git a/data/po/pt_PT.po b/data/po/pt_PT.po new file mode 100644 index 0000000..3336ea7 --- /dev/null +++ b/data/po/pt_PT.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Para cima" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Início" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ver por lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Vista por miniatura" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Falha ao apagar" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Ficheiro DRM. Impossível enviar" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nome do ficheiro inválido" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Máximo alcançado" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permissão negada" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Falha de envio" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "A pasta de destino é uma sub-pasta da pasta de origem" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Ficheiro inexistente" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Impossível copiar" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Impossível mover" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memória insuficiente na memória do telefone. Elimine alguns items e tente novamente" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Falha ao copiar" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Falha ao mover" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Memória insuficiente. %s disponíveis" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Já está a ser utilizado o mesmo nome" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Impossível mover. Pasta de destino igual à pasta de origem" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Criar pasta" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Colar aqui" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Alertas" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fundos" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefone" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imagens" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sons" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Transferências" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Cartão de memór." + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Armazenamento externo" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editar" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Eliminar" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mover" + +msgid "IDS_MF_BODY_UP" +msgstr "Para cima" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mover para aqui" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiar" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Procurar" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mais" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Criar pasta" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nome da pasta" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "O meu álbum" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Visualizar como" + +msgid "IDS_MF_SK3_BACK" +msgstr "Voltar" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Os meus clips de vídeo" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Estado dos direitos" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Representante" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Contagem" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Conteúdo" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervalo" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "M. nm." + +msgid "IDS_MF_BODY_TIME" +msgstr "Hora" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Contagem temporizada" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tipo" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Ilimitado" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Subs." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Toque do chamador" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nome" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiado" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nada seleccionado" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Memória de pilha insuficiente" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memória insuficiente. Apague alguns itens" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Criado na data" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informações de GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitude GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitude GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versão GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalhes" + +msgid "IDS_MF_BODY_ANY" +msgstr "Qualquer" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Utilizações disponíveis" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Executar" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Reencaminhar" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Impossível" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Os dados MMC estão a ser iniciados..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Possível" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimir" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Validade" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nova pasta" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editar" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Listar por" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mover para aqui" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuar" + +msgid "IDS_MF_POP_COPYING" +msgstr "A copiar..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Colar aqui" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tipo de ficheiro não suportado" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Vista de detalhes" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Ascendente" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descendente" + +msgid "IDS_MF_TAB_ALL" +msgstr "Tudo" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Proc. em todas pastas" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vista de miniatura" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Mostrar extensão de ficheiro" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Ordenar por" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista e detalhes" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Nome de pasta já existente" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ocultar ext. ficheiro" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nome (de A a Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nome (de Z a A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Data (mais recente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Data (mais antiga)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Ir para Os Meus Ficheiros" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tons de toque" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nenhum rosto detectado" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Adic ecrã princi" + diff --git a/data/po/ro.po b/data/po/ro.po new file mode 100644 index 0000000..20f1db6 --- /dev/null +++ b/data/po/ro.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Sus" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Acasă" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Vizualizare tip listă" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Vizualizare imagini în format redus" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Ştergerea nu a reuşit" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Fişier DRM. Imposibil de trimis" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Nume fişier incorect" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "S-a atins nivelul maxim pentru folder" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Permisiunea a fost refuzată" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Trimitere nereuşită" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Fişierul de destinaÅ£ie este un subfişier al fişierului sursă" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Acest fişier nu există" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Imposibil de copiat" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Imposibil de mutat" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Memoria telefonului este insuficientă. ŞtergeÅ£i câteva elemente şi încercaÅ£i din nou" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Copierea nu a reuşit" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Mutarea nu a reuşit" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Memorie insuficientă. %s disponibil" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Acelaşi nume deja în uz" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Imposbil de mutat. Folderul de destinaÅ£ie acelaşi cu folderul sursă" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Creare folder" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Lipire aici" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Avertizări" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fundaluri" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Imagini" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videoclipuri" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sunete" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Descărcări" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Cartelă de memorie" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Stocare externă" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Editare" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Ştergere" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Mutare" + +msgid "IDS_MF_BODY_UP" +msgstr "Sus" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Mutare aici" + +msgid "IDS_MF_SK3_COPY" +msgstr "Copiere" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortare după" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Căutare" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mai multe" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Creare director" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Nume director" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Albumul meu" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Vizualizare ca" + +msgid "IDS_MF_SK3_BACK" +msgstr "Înapoi" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Clipurile mele video" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stare drepturi" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Distribuitor" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Contor" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "ConÅ£ine" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Reden." + +msgid "IDS_MF_BODY_TIME" +msgstr "Oră" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Numărătoare temporizată" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tip" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Nelimitat" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Înloc." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Ton sonerie apelant" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nume" + +msgid "IDS_MF_POP_COPIED" +msgstr "Copiat" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nimic selectat" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Memorie heap insuficientă" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Memorie insuficientă. ŞtergeÅ£i câteva elemente" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Dată creare" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "InformaÅ£ii GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Latitudine GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Longitudine GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Versiune GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalii" + +msgid "IDS_MF_BODY_ANY" +msgstr "Oricare" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Utilizări disponibile" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Executare" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "RedirecÅ£ionare" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Imposibil" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Se iniÅ£ializează datele MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Posibil" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Imprimare" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Valabilitate" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Folder nou" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Editare" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Listare după" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Mutare aici" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Continuare" + +msgid "IDS_MF_POP_COPYING" +msgstr "Copiere..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Lipire aici" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Tip fişier neacceptat" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Afişare detaliată" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Crescător" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Descrescător" + +msgid "IDS_MF_TAB_ALL" +msgstr "Toate" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Căutare totală foldere" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Vizualizare pictograme" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Afişare extensie de fişier" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortare după" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Listă şi detalii" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Numele directorului există deja" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Ascundere ext. fişier" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nume (de la A la Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nume (de la Z la A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dată (cele mai recente)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dată (cele mai vechi)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Accesare Fişierele mele" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tonuri sonerie" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nicio faţă detectată" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Ad. la ec. prin." + diff --git a/data/po/ru_RU.po b/data/po/ru_RU.po new file mode 100644 index 0000000..a519987 --- /dev/null +++ b/data/po/ru_RU.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Вверх" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Домой" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Просмотр в виде списка" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Просмотр по эскизам" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Сбой удаления" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Файл DRM. Невозможно отправить" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Неверное имя файла" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Достигнуто макс. количество папок" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Разрешение не получено" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Сбой передачи" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Папка назначения является вложенной в исходной папке" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Файл не существует" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Невозможно скопировать" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Невозможно переместить" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Недостаточно памяти телефона. Удалите ненужные элементы и повторите попытку" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Сбой копирования" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Сбой перемещения" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Недостаточно памяти. Свободная память: %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Имя уже используется" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Невозможно переместить. Папка назначения совпадает с исходной папкой" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Создать папку" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Вставить сюда" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Оповещения" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Обои" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Телефон" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Картинки" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Видео" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Звуки" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Загрузки" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Карта памяти" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Внешний носитель" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Изменить" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Удалить" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Переместить" + +msgid "IDS_MF_BODY_UP" +msgstr "Вверх" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Переместить сюда" + +msgid "IDS_MF_SK3_COPY" +msgstr "Копир." + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Сортировка" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Поиск" + +msgid "IDS_MF_SK3_MORE" +msgstr "Опции" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Создать папку" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Имя папки" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Мой альбом" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Просмотреть как" + +msgid "IDS_MF_SK3_BACK" +msgstr "Назад" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Мои видеоклипы" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Состояние прав" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Поставщик" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Количество" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Содержит" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Индивидуальный" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Интервал" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Переим." + +msgid "IDS_MF_BODY_TIME" +msgstr "Время" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Счетчик" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Тип" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Не ограничено" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Заменить" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Мелодия контакта" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Имя" + +msgid "IDS_MF_POP_COPIED" +msgstr "Скопировано" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Ничего не выбрано" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Недостаточно динамической памяти" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Недостаточно памяти. Удалите некоторые элементы" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Дата создания" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Информация GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Широта по GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Долгота по GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Версия GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Сведения" + +msgid "IDS_MF_BODY_ANY" +msgstr "Любой" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Доступно" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Запуск" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Пересылка" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Невозможно" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Инициализация данных MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Возможно" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Печать" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Период действия" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Новая папка" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Изменить" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Сортировка по" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Переместить сюда" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Продолжить" + +msgid "IDS_MF_POP_COPYING" +msgstr "Копирование..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Вставить сюда" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Неподдерживаемый тип файла" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Просмотр сведений" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "По возрастанию" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "По убыванию" + +msgid "IDS_MF_TAB_ALL" +msgstr "Все" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Поиск по всем папкам" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Эскизы" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Показать расширение файла" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Сортировка" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Подробный список" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Имя папки уже существует" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Скрыть расширение" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Имя (от А до Я)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Имя (от Я до А)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Дата (сначала последние)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Дата (сначала старые)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Перейти в Мои файлы" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Мелодии звонка" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Лицо не обнаружено" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Доб. на главный" + diff --git a/data/po/sk.po b/data/po/sk.po new file mode 100644 index 0000000..ce31035 --- /dev/null +++ b/data/po/sk.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Hore" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Domov" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "ZobraziÅ¥ podľa zoznamu" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "ZobraziÅ¥ podľa miniatúr" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Vymazanie sa nepodarilo" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Súbor DRM. Nedá sa odoslaÅ¥" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neplatný názov súboru" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Dosiahol sa maximálny počet priečinkov" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Povolenie odmietnuté" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Odoslanie zlyhalo" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Cieľový priečinok je podpriečinkom zdrojového priečinka" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Súbor neexistuje" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nedá sa kopírovaÅ¥" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nedá sa presunúť" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nedostatok pamäte telefónu. Vymažte niektoré položky a skúste to znova" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopírovanie sa nepodarilo" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Presunutie sa nepodarilo" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nedostatok pamäte. K dispozícii je %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Rovnaký názov sa už používa" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nedá sa premiestniÅ¥. Cieľový priečinok je zhodný so zdrojovým priečinkom" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "VytvoriÅ¥ priečinok" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "PrilepiÅ¥ sem" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Výstrahy" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Tapety" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefón" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Obrázky" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videá" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Zvuky" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Stiahnuté položky" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Pamäťová karta" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Exter. úložný priestor" + +msgid "IDS_MF_SK3_EDIT" +msgstr "UpraviÅ¥" + +msgid "IDS_MF_SK3_DELETE" +msgstr "OdstrániÅ¥" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Presun." + +msgid "IDS_MF_BODY_UP" +msgstr "Hore" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Presunúť sem" + +msgid "IDS_MF_SK3_COPY" +msgstr "KopírovaÅ¥" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "ZoradiÅ¥ podľa" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "HľadaÅ¥" + +msgid "IDS_MF_SK3_MORE" +msgstr "ĎalÅ¡ie" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "VytvoriÅ¥ priečinok" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Názov priečinka" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Môj album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "ZobraziÅ¥ ako" + +msgid "IDS_MF_SK3_BACK" +msgstr "Späť" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moje videoklipy" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stav práv" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Dodávateľ" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Počet" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Obsahuje" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Jednotlivé" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Prem." + +msgid "IDS_MF_BODY_TIME" +msgstr "Čas" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Časovaný počet" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Typ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neobmedzené" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "NahradiÅ¥" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Zvonenie volajúceho" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Meno" + +msgid "IDS_MF_POP_COPIED" +msgstr "Skopírované" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nič nie je vybrané" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nedostatok odkladacej pamäte" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedostatok pamäte. Vymažte niektoré položky" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Dátum vytvorenia" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informácie" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Zemepisná šírka GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Zemepisná dĺžka GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Verzia GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Podrobnosti" + +msgid "IDS_MF_BODY_ANY" +msgstr "VÅ¡etko" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Počet použití k dispozícii" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "VykonaÅ¥" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Preposlanie" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nemožné" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Inicializujú sa údaje MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Možné" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Tlač" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "PlatnosÅ¥" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nový priečinok" + +msgid "IDS_MF_OPT_EDIT" +msgstr "UpraviÅ¥" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "ZoradiÅ¥ podľa" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Presunúť sem" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "PokračovaÅ¥" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopírovanie..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "VložiÅ¥ sem" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepodporovaný typ súboru" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detailné zobrazenie" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Vzostupne" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Zostupne" + +msgid "IDS_MF_TAB_ALL" +msgstr "VÅ¡etko" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "HľadaÅ¥ vo vÅ¡et. prieč." + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Zobrazenie miniatúr" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "ZobraziÅ¥ príponu súboru" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "UsporiadaÅ¥ podľa" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Zoznam a podrobnosti" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Názov priečinka už existuje" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "SkryÅ¥ príponu súboru" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Názov (od A po Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Názov (od Z po A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Dátum (najnovÅ¡ie)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Dátum (najstarÅ¡ie)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "ÍsÅ¥ na Moje súbory" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Zvonenia" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Nedetekovala sa žiadna tvár" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Prid. na dom. s." + diff --git a/data/po/sl.po b/data/po/sl.po new file mode 100644 index 0000000..8935058 --- /dev/null +++ b/data/po/sl.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Gor" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Domov" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Pregled po seznamu" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Prikaži s sličicami" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Brisanje ni uspelo" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Datoteka DRM. Ni mogoče shraniti" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neveljavno ime datoteke" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Doseženo je največje dovoljeno Å¡tevilo map" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Dovoljenje zavrnjeno" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "PoÅ¡iljanje ni uspelo" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Ciljna mapa je podmapa izvorne" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Ta datoteka ne obstaja" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Ni mogoče kopirati" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Premikanje ni mogoče" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Ni dovolj pomnilnika v telefonskem polnilniku. ZbriÅ¡ite nekaj elementov in poskusite znova" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiranje ni uspelo" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Premikanje ni uspelo" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Ni dovolj pomnilnika. Na voljo je %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "XXX se že uporablja" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ni mogoče premakniti. Ciljna mapa je enaka izvorni" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Ustvari mapo" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Prilepi sem" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Opozorila" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Ozadja" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Slike" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videoposnetki" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Zvoki" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Prenosi" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Pomniln. kartica" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Zunanji pomnilnik" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Uredi" + +msgid "IDS_MF_SK3_DELETE" +msgstr "IzbriÅ¡i" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Premik" + +msgid "IDS_MF_BODY_UP" +msgstr "Gor" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Premakni sem" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiraj" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Razvrsti po" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Iskanje" + +msgid "IDS_MF_SK3_MORE" +msgstr "Več" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Ustvari mapo" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ime mape" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Moj album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Prikaži kot" + +msgid "IDS_MF_SK3_BACK" +msgstr "Nazaj" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moji videoposnetki" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Stanje pravic" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Ponudnik" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Å tetje" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Vsebuje" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Posamezno" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Preim." + +msgid "IDS_MF_BODY_TIME" +msgstr "Čas" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Časovno Å¡tevilo" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Vrsta" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neomejeno" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Zamenjaj" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Melodija kličočega" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Ime" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopirano" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Nič ni izbrano" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Ni dovolj pomnilnika sklada" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Ni dovolj pomnilnika. IzbriÅ¡ite nekaj predmetov" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Datum ustvarjanja" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Informacije GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Zemljepisna Å¡irina GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Zemljepisna dolžina GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Različica GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Podrob." + +msgid "IDS_MF_BODY_ANY" +msgstr "Karkoli" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Å tevilo uporab" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Izvedi" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Posredovanje" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nemogoče" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Podatki MMC se inicializirajo ..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mogoče" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Tiskanje" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Veljavnost" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Nova mapa" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Uredi" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Razvrsti po" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Premakni sem" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Nadaljuj" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiram ..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Prilepi sem" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepodprta vrsta datoteke" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Podroben ogled" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Naraščajoče" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Padajoče" + +msgid "IDS_MF_TAB_ALL" +msgstr "Vse" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Iskanje po vseh mapah" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Prikaz sličice" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Prikaži končnico datoteke" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Uredi po" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Seznam in podrobnosti" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ime mape že obstaja" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Skrij pripono datoteke" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Ime (od A proti Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Ime (od Z proti A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (NajnovejÅ¡i)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (NajstarejÅ¡i)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Pojdi na Moje datot." + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Zvonjenja" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Obraz ni zaznan" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Dod. na dom.zas." + diff --git a/data/po/sr.po b/data/po/sr.po new file mode 100644 index 0000000..0b47b9e --- /dev/null +++ b/data/po/sr.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Gore" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Početak" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Prikaži po listi" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Prikaži kao indeksne sličice" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Brisanje neuspeÅ¡no" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM fajl. Ne može se poslati" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Neispravan naziv fajla" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Dostignut maksimalan broj foldera" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Dozvola odbijena" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Slanje neuspeÅ¡no" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "OdrediÅ¡ni folder je podfolder izvornog foldera" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Fajl ne postoji" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nemoguće kopirati" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Nemoguće premestiti" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Nedovoljno memorije u memoriji telefona. ObriÅ¡i neke stavke i probaj opet" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopiranje neuspeÅ¡no" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "PremeÅ¡tanje neuspeÅ¡no" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Nedovoljna memorija. %s dostupno" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Taj naziv je već u upotrebi" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Nemoguće premestiti. OdrediÅ¡ni folder isti kao izvorni" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Kreiraj folder" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Zalepi ovde" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Upozorenja" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Tapeti" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Slike" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Video zapisi" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Zvuci" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Preuzimanja" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Memor. kartica" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Spoljna memorija" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Izmeni" + +msgid "IDS_MF_SK3_DELETE" +msgstr "ObriÅ¡i" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Premesti" + +msgid "IDS_MF_BODY_UP" +msgstr "Gore" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Premesti ovde" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiraj" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortiraj po" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Pretraga" + +msgid "IDS_MF_SK3_MORE" +msgstr "JoÅ¡" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Kreiraj folder" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Naziv foldera" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Moj album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Videti kao" + +msgid "IDS_MF_SK3_BACK" +msgstr "Nazad" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Moji video klipovi" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Pravni status" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Dobavljač" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Broj" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Sadrži" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Pojedinačno" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Preim." + +msgid "IDS_MF_BODY_TIME" +msgstr "Vreme" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Preostalo vreme" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tip" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Neograničeno" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Zameni" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Ton zvona pozivaoca" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Ime" + +msgid "IDS_MF_POP_COPIED" +msgstr "Iskopirano" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "NiÅ¡ta nije izabrano" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Nedovoljna memorija" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Nedovoljno memorije. ObriÅ¡i neke od stavki" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Datum kreiranja" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS informacije" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Geografska Å¡irina za GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Geografska dužina za GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Verzija GPS-a" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Detalji" + +msgid "IDS_MF_BODY_ANY" +msgstr "Sve" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Moguće upotrebe" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "IzvrÅ¡i" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Prosleđivanje" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Nemoguće" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC podaci se inicijalizuju..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "moguće" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Å tampaj" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Važenje" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Novi folder" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Izmeni" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Listaj po" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Premesti ovde" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Nastavi" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopiranje..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Zalepi ovde" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Nepodržani tip fajla" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Prikaz detalja" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Rastuće" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Opadajuće" + +msgid "IDS_MF_TAB_ALL" +msgstr "Sve" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Pretraži sve foldere" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Indeksni prikaz" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Prikaži ekstenziju fajla" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortiraj po" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista sa detaljima" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ime foldera već postoji" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Sakrij det. tipa fajla" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Ime (od A do Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Ime (od Z do A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datumu (najnovije)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datumu (najstarije)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Idi u Moje fajlove" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Tonovi zvona" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Lice nije detektovano" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Dodaj na početnu" + diff --git a/data/po/sv.po b/data/po/sv.po new file mode 100644 index 0000000..0bc4a3b --- /dev/null +++ b/data/po/sv.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "UppÃ¥t" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Hem" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Visa som lista" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Visa som miniatyrbilder" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Radering misslyckades" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM-fil. Kan inte skicka" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Ogiltigt filnamn" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Max antal mappar" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "TillstÃ¥nd nekades" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Sändning misslyckades" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "MÃ¥lmappen är en undermapp till källmappen" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Filen finns inte" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Det gÃ¥r inte att kopiera" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Det gÃ¥r inte att flytta" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Otillräckligt telefonminne. Radera nÃ¥gra filer och försök igen" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopieringen misslyckades" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Det gick inte att flytta" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "För lite minne. %s tillgängligt" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Detta namn används redan" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Kan inte flytta. MÃ¥lmappen är densamma som källmappen" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Skapa mapp" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Klistra in här" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "PÃ¥minnelser" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Bakgrunder" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Bilder" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videoklipp" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Ljud" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Nedladdningar" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Minneskort" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Externt minne" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Redigera" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Radera" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Flytta" + +msgid "IDS_MF_BODY_UP" +msgstr "Upp" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Flytta hit" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopiera" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sortera efter" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Sök" + +msgid "IDS_MF_SK3_MORE" +msgstr "Mer" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Skapa mapp" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Mappnamn" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mitt album" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Visa som" + +msgid "IDS_MF_SK3_BACK" +msgstr "Åter" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mina videoklipp" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Rättighetsstatus" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Leverantör" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Antal" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "InnehÃ¥ller" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individuell" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Intervall" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Namnb." + +msgid "IDS_MF_BODY_TIME" +msgstr "Tid" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Tidsgräns för räkning" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Typ" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Obegränsad" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Ersätt" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Ringsignal till Foto-ID" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Namn" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopierad" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Inget markerat" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "För lite heap-minne" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Minnet räcker inte. Radera nÃ¥gra objekt" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Skapad den" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS-information" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS-latitud" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS-longitud" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS-version" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Info" + +msgid "IDS_MF_BODY_ANY" +msgstr "Alla" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Tillgängliga tillämpningar" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Exekvera" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Vidarebefordra" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Ej möjlig" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC-data initieras..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Möjlig" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Skriv ut" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Giltighet" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ny mapp" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Redigera" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Sortera efter" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Flytta hit" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Fortsätt" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopierar..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Klistra in här" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Filtypen stöds inte" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Detaljvy" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Stigande" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Fallande" + +msgid "IDS_MF_TAB_ALL" +msgstr "Alla" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Sök i alla mappar" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Miniatyrer" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Visa filtillägg" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sortera efter" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Lista och information" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Mappnamnet finns redan" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Dölj filtillägg" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Namn (A till Ö)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Namn (Ö till A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Datum (senaste)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Datum (äldsta)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "GÃ¥ till Mina filer" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringsignaler" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Inget ansikte hittades" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Lägg till pÃ¥ hem" + diff --git a/data/po/tr_TR.po b/data/po/tr_TR.po new file mode 100644 index 0000000..da32618 --- /dev/null +++ b/data/po/tr_TR.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Yukarı" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "A.Syf" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Liste şeklinde göster" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Küçük resim görünümü" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Silinemedi" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM dosyası gönderilemiyor" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Geçersiz dosya adı" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Maksimum" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Ä°zin reddedildi" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Gönderme Başarısız" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Hedef klasör kaynak klasörün alt klasörü" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Dosya yok" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Kopyalanamıyor" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Taşınamıyor" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Telefon belleğinde yeterli yer yok. Bazı öğeleri silin ve tekrar deneyin" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Kopyalama başarısız" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Taşıma başarısız" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Yeterli hafıza yok. %s kullanılabilir" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ä°sim zaten kullanımda" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Taşınamıyor. Hedef klasör kaynak klasörle aynı" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Klasör oluştur" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Buraya yapıştır" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Uyarılar" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Duvar kağıtları" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Resimler" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videolar" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Sesler" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Ä°ndirilenler" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Hafıza kartı" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Harici bellek" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Düzenle" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Sil" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Taşı" + +msgid "IDS_MF_BODY_UP" +msgstr "Yukarı" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Buraya taşı" + +msgid "IDS_MF_SK3_COPY" +msgstr "Kopyala" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Sırala" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Bul" + +msgid "IDS_MF_SK3_MORE" +msgstr "Diğer" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Klasör oluştur" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Klasör adı" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Albümüm" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Başka adla görüntüle" + +msgid "IDS_MF_SK3_BACK" +msgstr "Geri" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Video kliplerim" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Hak durumu" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Sağlayıcı" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "sayım" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "İçindekiler" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Kişisel" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Aralık" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Y. adl" + +msgid "IDS_MF_BODY_TIME" +msgstr "Saat" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Zamanlı sayım" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tür" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Sınırsız" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Değiştir" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Arayan zil sesi tonu" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Ä°sim" + +msgid "IDS_MF_POP_COPIED" +msgstr "Kopyalandı" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Bir şey seçilmedi" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Yeterli küme hafızası yok" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Yeterli hafıza yok. Bazı öğeleri silin." + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Oluşturulma tarihi" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS bilgileri" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS enlem" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS boylam" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS versiyonu" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Ayrıntılar" + +msgid "IDS_MF_BODY_ANY" +msgstr "Herhangi" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Mevcut kullanımlar" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Uygulama" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Ä°letme" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Ä°mkansız" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC verileri başlatılıyor..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Mümkün" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Yazdır" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Geçerlilik" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Yeni klasör" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Düzenle" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Listele" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Buraya taşı" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Devam" + +msgid "IDS_MF_POP_COPYING" +msgstr "Kopyalanıyor..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Buraya yapıştır" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Desteklenmeyen dosya türü" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Ayrıntılı görünüm" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "Artan" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Azalan" + +msgid "IDS_MF_TAB_ALL" +msgstr "Hepsi" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Tüm klasörleri ara" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Küçük resim görünümü" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Dosya uzantılarını göster" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Sırala" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Liste ve ayrıntılar" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Dosya adı zaten var" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Dosya uzntılrını gizle" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Ad (A'dan Z'ye)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Ad (Z'den A'ya)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Tarih (En yeni)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Tarih (En eski)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Dosyalarım’a git" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Zil sesleri" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Yüz algılanamadı" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Ana sayfaya ekle" + diff --git a/data/po/uk.po b/data/po/uk.po new file mode 100644 index 0000000..6fc3ab7 --- /dev/null +++ b/data/po/uk.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Вгору" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Домашній" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Переглянути за списком" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Переглянути ескізи" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Збій видалення" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "Файл DRM. Неможливо надіслати" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Хибна назва файла" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Досягнуто максимальної кількості папок" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "У дозволі відмовлено" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Збій передачи" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Папка призначення є підпапкою вихідної папки" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Файл не існує" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Неможливо скопіювати" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Неможливо перемістити" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Недостатньо місця в пам’яті телефону. Видаліть декілька об’єктів і спробуйте ще раз" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Збій копіювання" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Збій переміщення" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Недостатньо пам’яті. %s доступно" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Ім’я вже використовується" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Неможливо перемістити. Папка призначення та вихідна папка однакові" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Створити папку" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Вставити сюди" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Сигнали" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Заставки" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Телефон" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Зображення" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Відео" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Звуки" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Завантаження" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Карта пам’яті" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Зовн. місце збереження" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Редагу-\nвати" + +msgid "IDS_MF_SK3_DELETE" +msgstr "Видал." + +msgid "IDS_MF_SK3_MOVE" +msgstr "Переміст." + +msgid "IDS_MF_BODY_UP" +msgstr "Вгору" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Перемістити сюди" + +msgid "IDS_MF_SK3_COPY" +msgstr "Копіювати" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Сорт. за" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Пошук" + +msgid "IDS_MF_SK3_MORE" +msgstr "Додатково" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Створити папку" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Ім'я папки" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Мій альбом" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Переглянути як" + +msgid "IDS_MF_SK3_BACK" +msgstr "НАЗАД" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Мої відеокліпи" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Стан прав" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Постачальник" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Кількість" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Містить" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Індивідуальні" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Інтервал" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Пер-м." + +msgid "IDS_MF_BODY_TIME" +msgstr "Час" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Тривалість використання" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Тип" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Необмежено" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Замінити" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Звук дзвінка абонента" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Назва" + +msgid "IDS_MF_POP_COPIED" +msgstr "Скопійовано" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Нічого не вибрано" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Недостатньо пам'яті" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Недостатньо пам’яті. Видаліть деякі об’єкти" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Дата створення" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "Інформація GPS" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "Широта GPS" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "Довгота GPS" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "Версія GPS" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Деталі" + +msgid "IDS_MF_BODY_ANY" +msgstr "Any" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Доступні використання" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Виконати" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Переадресація" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Неможливо" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "Ініціалізація даних MMC..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Можливо" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Друк" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Термін дії" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Ручний" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Редагувати" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Сортувати за" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Перемістити сюди" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Продовж." + +msgid "IDS_MF_POP_COPYING" +msgstr "Копіювання..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Вставити сюди" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Формат не підтримується" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Докладний перегляд" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "За зростанням" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "За спаданням" + +msgid "IDS_MF_TAB_ALL" +msgstr "Всі" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Шукати в усіх папках" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Ескіз" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Показати розширення файла" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Сортувати за" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Список і відомості" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Ім’я папки вже існує" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Приховати розшир.файлу" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Назва (А-Я)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Назва (Я-А)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Дата (остання)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Дата (найдавніша)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Пер. до моїх файлів" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Звуки дзвінка" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Обличчя не розпізнано" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Дод.на гол.екран" + diff --git a/data/po/update-po.sh b/data/po/update-po.sh new file mode 100644 index 0000000..5e49f90 --- /dev/null +++ b/data/po/update-po.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +PACKAGE=myfile +SRCROOT=../../source +POTFILES=POTFILES.in + +#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW +ALL_LINGUAS="te" + +XGETTEXT=/usr/bin/xgettext +MSGMERGE=/usr/bin/msgmerge + +echo -n "Make ${PACKAGE}.pot " +if [ ! -e $POTFILES ] ; then + echo "$POTFILES not found" + exit 1 +fi + +$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \ + --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES \ +&& test ! -f ${PACKAGE}.po \ + || (rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot) + +if [ $? -ne 0 ]; then + echo "error" + exit 1 +else + echo "done" +fi + +for LANG in $ALL_LINGUAS; do + echo "$LANG : " + + if [ ! -e $LANG.po ] ; then + sed 's/CHARSET/UTF-8/g' ${PACKAGE}.pot > ${LANG}.po + echo "${LANG}.po created" + else + if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then + if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then + rm -f ${LANG}.new.po + else + if mv -f ${LANG}.new.po ${LANG}.po; then + echo "" + else + echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2 + rm -f ${LANG}.new.po + exit 1 + fi + fi + else + echo "msgmerge for $LANG failed!" + rm -f ${LANG}.new.po + fi + fi + echo "" +done + diff --git a/data/po/uz.po b/data/po/uz.po new file mode 100644 index 0000000..0ddeffd --- /dev/null +++ b/data/po/uz.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "Yuqoriga" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "Asosiy" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "Ro‘yxat bo‘yicha ko‘rib chiqish" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "Eskiz bo‘y. ko‘r." + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "Yo‘q qilish bajarilmadi" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM fayl. Yuborib bo‘lmaydi" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "Noto‘g‘ri fayl nomi" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "Jildlar soni maksimal miqdorga yetdi" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "Ruxsat rad etildi" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "Yuborish bajarilmadi" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "Yakuniy jild manba jildining tagjildi hisoblanadi" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "Ushbu fayl mavjud emas" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "Nusxa ko‘chirib bo‘lmaydi" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "Ko‘chirib bo‘lmaydi" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "Telefonda xotira yetarli emas. Ba’zi elementlarni yo‘q qiling va qayta urinib ko‘ring" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "Nusxa olish bajarilmadi" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "Ko‘chirib bo‘lmadi" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "Xotira yetarli emas. %s mavjud" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "Bunday nom avvaldan ishlatilmoqda" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "Ko‘chirib bo‘lmaydi. Yakuniy jild manba jildi bilan bir xil" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "Jild yaratish" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "Bu yerga qo‘yish" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "Signallar" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "Fon rasmlari" + +msgid "IDS_MF_TAB_PHONE" +msgstr "Telefon" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "Tasvirlar" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "Videolar" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "Ovozlar" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "Yuklanishlar" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "Xotira kartasi" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "Tashqi xotira" + +msgid "IDS_MF_SK3_EDIT" +msgstr "Tahrirlash" + +msgid "IDS_MF_SK3_DELETE" +msgstr "O'chirish" + +msgid "IDS_MF_SK3_MOVE" +msgstr "Ko‘chirish" + +msgid "IDS_MF_BODY_UP" +msgstr "Yuqoriga" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "Bu yerga ko‘ch." + +msgid "IDS_MF_SK3_COPY" +msgstr "Nusxa olish" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "Quyid. bo‘y. sar" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "Qidirish" + +msgid "IDS_MF_SK3_MORE" +msgstr "Yana" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "Jild yaratish" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "Jild nomi" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "Mening albomim" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "Quyidagi sifatida ko‘rib chiqish" + +msgid "IDS_MF_SK3_BACK" +msgstr "Orqaga" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "Mening video kliplarim" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "Huquq holati" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "Ta’minotchi" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "Hisob" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "Tarkibi:" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "Individual" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "Interval" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "Nm/o‘z" + +msgid "IDS_MF_BODY_TIME" +msgstr "Vaqt" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "Vaqti belgilangan sanoq" + +msgid "IDS_MF_BODY_TYPE" +msgstr "Tur" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "Cheklanmagan" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "Almasht." + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "Qo‘ng‘iroq qiluvchi ringtoni" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "Nom" + +msgid "IDS_MF_POP_COPIED" +msgstr "Nusxa olindi" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "Hech narsa tanlanmagan" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "Xip xotira yetarli emas" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "Xotira yetarli emas. Ba’zi elementlarni o'chiring" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "Yaratilgan sana" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS ma’lumotlari" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS kengligi" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS uzunligi" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS versiyasi" + +msgid "IDS_MF_SK_DETAILS" +msgstr "Tafsilot" + +msgid "IDS_MF_BODY_ANY" +msgstr "Har qanday" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "Mavjud foydalanishlar" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "Amalga oshirish" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "Boshqaga yo‘naltirish" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "Imkonsiz" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "MMC ma’lumoti initsializatsiyalanmoqda..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "Taxminiy" + +msgid "IDS_MF_BODY_PRINT" +msgstr "Chop etish" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "Amal qilish" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "Yangi jild" + +msgid "IDS_MF_OPT_EDIT" +msgstr "Tahrirlash" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "Quyidagi bo‘yicha ro‘yxat" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "Bu yerga ko‘chiring" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "Davom ettirish" + +msgid "IDS_MF_POP_COPYING" +msgstr "Nusxa ko‘chirilmoqda..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "Bu yerga qo‘shing" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "Qo‘llab-quvvatlanmaydigan fayl turi" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "Batafsil" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "O‘sish tartibida" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "Kamayib borish" + +msgid "IDS_MF_TAB_ALL" +msgstr "Barcha" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "Barcha jildlarni qidir" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "Eskizli ko'rinish" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "Fayl kengaytmasini ko‘rsatish" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "Saralash" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "Ro‘yxat va tafsilotlar" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "Jild nomi avvaldan mavjud" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "Fayl kengaytma. yashir" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "Nom (A dan Z ga)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "Nom (Z dan A ga)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "Sana (Eng oxirgi)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "Sana (Eng eski)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "Fayllarimga o‘ting" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "Ringtonlar" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "Yuz tanilmadi" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "Asosiyga qo‘sh" + diff --git a/data/po/zh_CN.po b/data/po/zh_CN.po new file mode 100644 index 0000000..bad94d9 --- /dev/null +++ b/data/po/zh_CN.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "向上" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "主屏" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "通过列表查看" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "通过缩略图查看" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "删除失败" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM 文件。无法发送" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "文件名无效" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "已达最大文件夹数" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "许可被拒绝" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "发送失败" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "目标文件夹是源文件夹的子文件夹" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "此文件不存在" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "无法复制" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "无法移动" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "手机内存不足。请删除部分项目并重试" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "复制失败" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "移动失败" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "存储空间不足。 剩余 %s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "相同名字已使用" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "无法移动。目的地文件夹与源文件夹相同" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "新文件夹" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "粘贴到此处" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "提示" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "墙纸" + +msgid "IDS_MF_TAB_PHONE" +msgstr "话机" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "图片" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "视频" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "声音" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "下载列表" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "存储卡" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "外部存储器" + +msgid "IDS_MF_SK3_EDIT" +msgstr "编辑" + +msgid "IDS_MF_SK3_DELETE" +msgstr "删除" + +msgid "IDS_MF_SK3_MOVE" +msgstr "移动" + +msgid "IDS_MF_BODY_UP" +msgstr "上" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "移动到这里" + +msgid "IDS_MF_SK3_COPY" +msgstr "复制" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "排序方式" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "搜索" + +msgid "IDS_MF_SK3_MORE" +msgstr "更多" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "新建文件夹" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "文件夹名称" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "我的相册" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "查看方式" + +msgid "IDS_MF_SK3_BACK" +msgstr "返回" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "我的录像片段" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "授权状态" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "提供者" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "计数" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "包括" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "个人" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "间隔" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "重命名" + +msgid "IDS_MF_BODY_TIME" +msgstr "时间" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "计时" + +msgid "IDS_MF_BODY_TYPE" +msgstr "类型" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "无限" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "替换" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "来电铃声" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "名称" + +msgid "IDS_MF_POP_COPIED" +msgstr "已复制" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "未选择" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "堆存储器容量不足" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "存储空间不足。请删除部分项目" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "创建日期" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS 信息" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS纬度" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS经度" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS 版本" + +msgid "IDS_MF_SK_DETAILS" +msgstr "详细信息" + +msgid "IDS_MF_BODY_ANY" +msgstr "任何" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "可用于" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "执行" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "转发" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "不可以" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "正在初始化 MMC 数据..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "可以" + +msgid "IDS_MF_BODY_PRINT" +msgstr "打印" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "有效" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "新文件夹" + +msgid "IDS_MF_OPT_EDIT" +msgstr "编辑" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "排序方式" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "移动到这里" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "继续" + +msgid "IDS_MF_POP_COPYING" +msgstr "正在复制..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "粘贴至此" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支持的文件类型" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "详情查看" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "升序" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "降序" + +msgid "IDS_MF_TAB_ALL" +msgstr "全部" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "搜索所有文件夹" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "缩略图查看" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "显示文件扩展名" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "排序方式" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "列表和详情" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "文件夹名称已经存在" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "隐藏文件扩展名" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "名称(A 至 Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "名称(Z 至 A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "日期(最近)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "日期(最早)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "转到我的文件" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "铃声" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "未侦测到脸部" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "添加至主页" + diff --git a/data/po/zh_HK.po b/data/po/zh_HK.po new file mode 100644 index 0000000..03fa8aa --- /dev/null +++ b/data/po/zh_HK.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "向上" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "首頁" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "按清單檢視" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "按縮圖檢視" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "刪除失敗" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM 檔案。無法發送" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "檔案名稱無效" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "資料夾數目已達上限" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "權限被拒絕" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "發送失敗" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "目標資料夾是來源資料夾的子資料夾" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "此檔案不存在" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "無法複製" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "無法移動" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "手機記憶體不足。刪除一些項目並再試" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "複製失敗" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "移動失敗" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "記憶體不足。%s 可用" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "相同名稱已被使用" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "無法移動。目的地資料夾與來源資料夾相同" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "建立資料夾" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "貼在這裡" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "提示" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "螢幕牆紙" + +msgid "IDS_MF_TAB_PHONE" +msgstr "手機" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "圖像" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "影片" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "聲音" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "下載項目" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "記憶卡" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "外置儲存裝置" + +msgid "IDS_MF_SK3_EDIT" +msgstr "編輯" + +msgid "IDS_MF_SK3_DELETE" +msgstr "刪除" + +msgid "IDS_MF_SK3_MOVE" +msgstr "移動" + +msgid "IDS_MF_BODY_UP" +msgstr "上" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "移到這裡" + +msgid "IDS_MF_SK3_COPY" +msgstr "複製" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "排序方式" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "搜尋" + +msgid "IDS_MF_SK3_MORE" +msgstr "更多" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "建立資料夾" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "資料夾名稱" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "我的相簿" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "檢視為" + +msgid "IDS_MF_SK3_BACK" +msgstr "返回" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "我的短片" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "版權狀態" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "供應商" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "計數" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "包含" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "個人" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "間隔" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "重新命名" + +msgid "IDS_MF_BODY_TIME" +msgstr "時間" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "計時" + +msgid "IDS_MF_BODY_TYPE" +msgstr "類型" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "無限制" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "取代" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "聯絡人來電鈴聲" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "名稱" + +msgid "IDS_MF_POP_COPIED" +msgstr "已複製" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "無已選擇項目" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "堆積記憶體不足" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除一些項目" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "建立日期" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS 資訊" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS緯度" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS經度" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS 版本" + +msgid "IDS_MF_SK_DETAILS" +msgstr "詳細資料" + +msgid "IDS_MF_BODY_ANY" +msgstr "任何" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "可供使用" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "執行" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "轉寄中" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "不可以" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "正在初始化 MMC 數據..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "可以" + +msgid "IDS_MF_BODY_PRINT" +msgstr "列印" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "有效期" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "新資料夾" + +msgid "IDS_MF_OPT_EDIT" +msgstr "編輯" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "排列按" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "移到這裡" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "繼續" + +msgid "IDS_MF_POP_COPYING" +msgstr "正在複製..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "貼在這裡" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支援的檔案類型" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "詳細檢視" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "升序" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "降序" + +msgid "IDS_MF_TAB_ALL" +msgstr "全部" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "搜尋所有資料夾" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "縮圖檢視" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "顯示檔案伸展內容" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "排序方式" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "清單及詳情" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "資料夾名稱已存在" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "隱藏副檔名" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "名稱 (A 至 Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "名稱 (Z 至 A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "日期(最近的)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "日期 (最舊的)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "前往我的檔案" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "鈴聲" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "未偵測到臉部" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "加入至首頁" + diff --git a/data/po/zh_SG.po b/data/po/zh_SG.po new file mode 100644 index 0000000..60441f7 --- /dev/null +++ b/data/po/zh_SG.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "向上" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "首页" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "通过列表查看" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "通过缩略图查看" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "删除失败" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM文件。无法发送" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "文件名无效" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "已达最大文件夹数" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "许可被拒绝" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "发送失败" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "目标文件夹是源文件夹的子文件夹" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "此文件不存在" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "无法复制" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "无法移动" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "手机内存不足。请删除部分项目并重试" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "复制失败" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "移动失败" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "存储空间不足. 剩余%s" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "相同名称已在使用" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "无法移动。目的地文件夹与源文件夹相同" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "创建文件夹" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "粘贴到此" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "提示" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "墙纸" + +msgid "IDS_MF_TAB_PHONE" +msgstr "手机" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "图像" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "录像" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "声音" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "下载" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "存储卡" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "外部存储器" + +msgid "IDS_MF_SK3_EDIT" +msgstr "编辑" + +msgid "IDS_MF_SK3_DELETE" +msgstr "删除" + +msgid "IDS_MF_SK3_MOVE" +msgstr "移动" + +msgid "IDS_MF_BODY_UP" +msgstr "上" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "移到这儿" + +msgid "IDS_MF_SK3_COPY" +msgstr "复制" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "排序方式" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "搜寻" + +msgid "IDS_MF_SK3_MORE" +msgstr "更多" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "创建文件夹" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "文件夹名称" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "我的相册" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "查看作为" + +msgid "IDS_MF_SK3_BACK" +msgstr "返回" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "我的视频剪辑" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "权限状态" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "提供者" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "计数" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "包括" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "个人" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "间隔" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "重命名" + +msgid "IDS_MF_BODY_TIME" +msgstr "时间" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "计时" + +msgid "IDS_MF_BODY_TYPE" +msgstr "类型" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "无限" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "替换" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "来电人铃声" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "名称" + +msgid "IDS_MF_POP_COPIED" +msgstr "已复制" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "未选择" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "堆存储器容量不足" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "内存已满\n请删除项目" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "创建日期" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS 信息" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS纬度" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS经度" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS 版本" + +msgid "IDS_MF_SK_DETAILS" +msgstr "详细信息" + +msgid "IDS_MF_BODY_ANY" +msgstr "任何" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "适用用法" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "执行" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "转发中" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "不可能" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "正在初始化 MMC 数据..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "可能" + +msgid "IDS_MF_BODY_PRINT" +msgstr "打印" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "有效" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "新文件夹" + +msgid "IDS_MF_OPT_EDIT" +msgstr "编辑" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "排序方式" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "移动至此" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "继续" + +msgid "IDS_MF_POP_COPYING" +msgstr "复制中…" + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "粘贴至此" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支持的文件类型" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "详情查看" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "升序" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "降序" + +msgid "IDS_MF_TAB_ALL" +msgstr "全部" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "搜索所有文件夹" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "缩略图查看" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "显示文件扩展名" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "排序通过" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "列表和详情" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "文件夹名称已经存在" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "隐藏文件扩展名" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "名称(A 至 Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "名称(Z 至 A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "日期(最近)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "日期(最晚)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "转到我的文件" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "铃声" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "未侦测到脸部" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "添加至主页" + diff --git a/data/po/zh_TW.po b/data/po/zh_TW.po new file mode 100644 index 0000000..9554728 --- /dev/null +++ b/data/po/zh_TW.po @@ -0,0 +1,318 @@ +msgid "IDS_MF_TAB_UP" +msgstr "向上" + +msgid "IDS_MF_BUTTON_HOME" +msgstr "主目錄" + +msgid "IDS_MF_OPT_VIEW_BY_LIST" +msgstr "依清單檢視" + +msgid "IDS_MF_OPT_VIEW_BY_THUMBNAIL" +msgstr "以縮圖檢視" + +msgid "IDS_MF_POP_DELETE_FAILED" +msgstr "刪除失敗" + +msgid "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +msgstr "DRM 檔案。無法傳送" + +msgid "IDS_MF_POP_INVALID_FILE_NAME" +msgstr "檔案名稱無效" + +msgid "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +msgstr "資料夾數目已達上限" + +msgid "IDS_MF_POP_PERMISSION_DENIED" +msgstr "權限被拒絕" + +msgid "IDS_MF_POP_SEND_FAILED" +msgstr "傳送失敗" + +msgid "IDS_MF_POP_THE_DESTINATION_FOLDER_IS_A_SUBFOLDER_OF_THE_SOURCE_FOLDER" +msgstr "目標資料夾為來源資料夾的子資料夾" + +msgid "IDS_MF_POP_THIS_FILE_DOES_NOT_EXIST" +msgstr "此檔案不存在" + +msgid "IDS_MF_POP_UNABLE_TO_COPY" +msgstr "無法複製" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE" +msgstr "無法移動" + +msgid "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +msgstr "沒有足夠的記憶體在手機上。刪除某些項目,然後再試一次" + +msgid "IDS_MF_POP_COPYING_FAILED" +msgstr "複製失敗" + +msgid "IDS_MF_POP_MOVING_FAILED" +msgstr "移動失敗" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_PS_AVAILABLE" +msgstr "記憶體不足。%s 可用" + +msgid "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +msgstr "相同名稱已在使用中" + +msgid "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +msgstr "無法移動。目標資料夾與來源資料夾相同" + +msgid "IDS_MF_SK3_CREATE_FOLDER" +msgstr "建立資料夾" + +msgid "IDS_MF_SK3_PASTE_HERE" +msgstr "複製到這裡" + +msgid "IDS_MF_BODY_ALERTS" +msgstr "提醒" + +msgid "IDS_MF_BODY_WALLPAPERS" +msgstr "桌布" + +msgid "IDS_MF_TAB_PHONE" +msgstr "電話" + +msgid "IDS_MF_BODY_IMAGES" +msgstr "圖像" + +msgid "IDS_MF_BODY_VIDEOS" +msgstr "影片" + +msgid "IDS_MF_BODY_SOUNDS" +msgstr "聲音" + +msgid "IDS_MF_BODY_DOWNLOADS" +msgstr "下載" + +msgid "IDS_MF_TAB_MEMORY_CARD" +msgstr "記憶卡" + +msgid "IDS_MF_TAB_EXTERNAL_STORAGE" +msgstr "外部儲存裝置" + +msgid "IDS_MF_SK3_EDIT" +msgstr "編輯" + +msgid "IDS_MF_SK3_DELETE" +msgstr "刪除" + +msgid "IDS_MF_SK3_MOVE" +msgstr "移動" + +msgid "IDS_MF_BODY_UP" +msgstr "上" + +msgid "IDS_MF_SK3_MOVE_HERE" +msgstr "移到這裡" + +msgid "IDS_MF_SK3_COPY" +msgstr "複製" + +msgid "IDS_MF_SK3_SORT_BY" +msgstr "排序依據" + +msgid "IDS_MF_SK3_SEARCH" +msgstr "搜尋" + +msgid "IDS_MF_SK3_MORE" +msgstr "更多" + +msgid "IDS_MF_OPT_CREATE_FOLDER" +msgstr "建立資料夾" + +msgid "IDS_MF_BODY_FOLDER_NAME" +msgstr "資料夾名稱" + +msgid "IDS_MF_BODY_ACCESS_MORE_MY_ALBUM" +msgstr "我的相簿" + +msgid "IDS_MF_OPT_VIEW_AS" +msgstr "檢視為" + +msgid "IDS_MF_SK3_BACK" +msgstr "上一步" + +msgid "IDS_MF_BODY_MY_VIDEO_CLIPS" +msgstr "我的影片片段" + +msgid "IDS_MF_BODY_RIGHT_STATUS" +msgstr "版權狀態" + +msgid "IDS_MF_BODY_VENDOR" +msgstr "供應商" + +msgid "IDS_MF_HEADER_COUNT" +msgstr "計數" + +msgid "IDS_MF_BODY_CONTAINS" +msgstr "包含" + +msgid "IDS_MF_BODY_INDIVIDUAL" +msgstr "個別" + +msgid "IDS_MF_BODY_INTERVAL" +msgstr "間隔" + +msgid "IDS_MF_BODY_RENAME_ABB" +msgstr "重新命名" + +msgid "IDS_MF_BODY_TIME" +msgstr "時間" + +msgid "IDS_MF_BODY_TIMED_COUNT" +msgstr "計時數" + +msgid "IDS_MF_BODY_TYPE" +msgstr "類型" + +msgid "IDS_MF_BODY_UNLIMITED" +msgstr "無限制" + +msgid "IDS_MF_BUTTON_REPLACE_ABB" +msgstr "取代" + +msgid "IDS_MF_OPT_CALLER_RINGTONE" +msgstr "來電者鈴聲" + +msgid "IDS_MF_OPT_LISTBY_NAME" +msgstr "名稱" + +msgid "IDS_MF_POP_COPIED" +msgstr "已複製" + +msgid "IDS_MF_POP_NOTHING_SELECTED" +msgstr "未選擇任何項目" + +msgid "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" +msgstr "堆積記憶體不足" + +msgid "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +msgstr "記憶體不足。請刪除部分項目" + +msgid "IDS_MF_BODY_CREATED_DATE" +msgstr "建立日期" + +msgid "IDS_MF_BODY_GPS_INFORMATION" +msgstr "GPS 資訊" + +msgid "IDS_MF_BODY_GPS_LATITUDE" +msgstr "GPS緯度" + +msgid "IDS_MF_BODY_GPS_LONGITUDE" +msgstr "GPS經度" + +msgid "IDS_MF_BODY_GPS_VERSION" +msgstr "GPS 版本" + +msgid "IDS_MF_SK_DETAILS" +msgstr "詳細資料" + +msgid "IDS_MF_BODY_ANY" +msgstr "任何" + +msgid "IDS_MF_BODY_AVAILABLE_USES" +msgstr "可供使用" + +msgid "IDS_MF_BODY_EXECUTE" +msgstr "執行" + +msgid "IDS_MF_BODY_FORWARDING" +msgstr "正在轉寄" + +msgid "IDS_MF_BODY_IMPOSSIBLE" +msgstr "不可能" + +msgid "IDS_MF_BODY_MMC_DATA_IS_INITIALIZING_ING" +msgstr "正在初始化 MMC 資料..." + +msgid "IDS_MF_BODY_POSSIBLE" +msgstr "可能" + +msgid "IDS_MF_BODY_PRINT" +msgstr "列印" + +msgid "IDS_MF_BODY_VALIDITY" +msgstr "有效期" + +msgid "IDS_MF_HEADER_NEW_FOLDER" +msgstr "新資料夾" + +msgid "IDS_MF_OPT_EDIT" +msgstr "編輯" + +msgid "IDS_MF_OPT_LIST_BY" +msgstr "排列依據" + +msgid "IDS_MF_OPT_MOVE_HERE" +msgstr "移到這裡" + +msgid "IDS_MF_POP_CONTINUE" +msgstr "繼續" + +msgid "IDS_MF_POP_COPYING" +msgstr "正在複製..." + +msgid "IDS_MF_POP_PASTE_HERE" +msgstr "複製到這裡" + +msgid "IDS_MF_POP_UNSUPPORTED_FILE_TYPE" +msgstr "不支援的檔案類型" + +msgid "IDS_MF_OPT_DETAIL_VIEW" +msgstr "詳細查看" + +msgid "IDS_MF_POP_ASCENDING" +msgstr "遞增" + +msgid "IDS_MF_POP_DESCENDING" +msgstr "遞減" + +msgid "IDS_MF_TAB_ALL" +msgstr "全部" + +msgid "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +msgstr "搜尋所有資料夾" + +msgid "IDS_MF_OPT_THUMBNAIL_VIEW" +msgstr "縮圖檢視" + +msgid "IDS_MF_OPT_SHOW_FILE_EXTENSION" +msgstr "顯示文件擴展名" + +msgid "IDS_MF_OPT_SORT_BY" +msgstr "排序依據" + +msgid "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +msgstr "清單及詳情" + +msgid "IDS_MF_POP_FOLDER_NAME_ALREADY_EXISTS" +msgstr "資料夾名稱已存在" + +msgid "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +msgstr "隱藏副檔名" + +msgid "IDS_MF_OPT_NAME_HA_TO_Z" +msgstr "名稱 (A 至 Z)" + +msgid "IDS_MF_OPT_NAME_HZ_TO_A" +msgstr "名稱 (Z 至 A)" + +msgid "IDS_MF_OPT_DATE_HMOST_RECENT" +msgstr "日期 (最近的)" + +msgid "IDS_MF_OPT_DATE_HOLDEST" +msgstr "日期 (最舊的)" + +msgid "IDS_MF_BUTTON_GO_TO_MY_FILES" +msgstr "前往我的檔案" + +msgid "IDS_MF_BODY_RINGTONES" +msgstr "鈴聲" + +msgid "IDS_MF_BODY_NO_FACE_DETECTED" +msgstr "未偵測到臉部" + +msgid "IDS_MF_BUTTON_ADD_TO_HOME" +msgstr "新增至首頁" + diff --git a/desktop/org.tizen.myfile.png b/desktop/org.tizen.myfile.png new file mode 100755 index 0000000000000000000000000000000000000000..85a1dcf841123e6830a175d38b6f22b9494ce37f GIT binary patch literal 57662 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

    0nHvRzq-OHk+MKj5fHAj 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%0DfI zY}xP3^*B7hMs7E~!U{Kwh6hiQ(XSs`Y5-)D1_tLyCO91^MAeAh#YbPSPj6~&Kkdx> zmOcQ!WW_Gqh037JCh;#d6@%0-m>j4qaf@pP_wT2ftsh}@nSg+dk3pJ4i0~kH(sa-? zx@-ghNe;@Cz!3m-BpfUZv%EODs4F`dY>^kjeVi+Gc*EV2hW`Mw&1vM>Bu#Eb_z7ajV_NZd+qoE24DvT)oF5{q{#qUNQ1puKrN*oo{(mmN+9LZIUl#nL0~(^ zwlx}^K}>c4Aj#2eZEO@8rwfv0Xe6QJf!dG51Jb0CWRs7aWv0osIEM@KTg_4?$I6qT z#oN}2o)vYXv9j#=KONQYf!{y2@?&gvhA59w|Jf?2j+T~t(l>9r%@94^h=&Md8yVAq z1myI?SV(MoX5-O4nCn=)iFtb7>^H4IsI!}TSRoL4WLky6y3~b zv8JT*7t>Ged&H^JS3Lp})js9Ux8aUplaF50Pp?aD>JSX>5rImxoJ6beUii z)UMV>q2VSY3J!gXu0?R<*3^q<`qwSTw10hQ?uh?BnzTqoB9c?gdF@!2*y4^8}V-zM?H=a{u}MT51j9Ju^E%wnd4hJ5f+^>SURML z$#_!KV^#<3mE}~4JaBMzt`Nb>>LK@^CXPF4+N%4}^Jdz*8K{nydcE#*`}e9BR@+BX z16y08C||kZGIg2A6Hu1I+EEe=gd@VlErL$dEoCmz+4#TjEpUK-lvWK53XzUSP(@?q z4R_`t`c2sgzyPY_Ioms8m;_iShW4Kz<}c`AUHD;qHq+M4iVpzQxaY(kdsWwVn>oG@ zri9v7Vu~mR4aE{l)07(8ed>F{@Rmxj*`e-+i72qP1%GhJ|7%<20PRw?;inC41qM=k zE!=avVcITof}tw}K)DVIvmItdU-8i@TeLK7+;8gr>t6$PK_tAHrs4oISmHasPtSUh zXrC?ZI+t*Ar5s9>vbpdmGu_Q+p8c==;2dz_$p+b`W4Q}kM<b`j}{AqVAJpF-@@tjzzf{pcJ>V>Tod zLZ*QN1=n>EP}$&HD?}TR^h~^D--=pnE5Nbf59~CC^(s5Fwx-4vYh0Q+SrMRNRJ#8~ zl`7Nm|Ni~AIgmybhCl`ooaO+RIm^*|+>mY%0Jp_Xmh52BxhUzpTP6 zhn~i>6te4bozX=xMZy`G|F!=d2TD+MR~skNS+#Q;Dbb@6sik5568mYVbAe0_RBpWf zS9OCm-8-Z#y=gN*DIHvC?#Ftg9JSip|9=1A94O{9*G4Dt;c{6Q3O{A(MqzsVLvA{v zZV2&n2B11iqulR4zOt%Hi-s17D8pL*k8gq*#RP8v4@|{kbd;?+gu&-;{eaCtxzUYB z<=}BTs4%Ls_5*hEBb z8nFfn+LcV;?g3ayBZBkGo8{OGCjM)%D$_P5;SXXdXCC<@5DJBSm!GspxiHoZ8#Hcb z%ozNFwi?7R)q0uGY^*J&%fm?6+

    &k3JjWYc*mVc_VuE@T{fP0wR@&i`APRAAa;N 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 S)&tzT@16(k@$94%{`mjbv9dq_ literal 0 HcmV?d00001 diff --git a/desktop/org.tizen.myfile.xml b/desktop/org.tizen.myfile.xml new file mode 100644 index 0000000..6bff1b6 --- /dev/null +++ b/desktop/org.tizen.myfile.xml @@ -0,0 +1,67 @@ + + + + Guangliang Wang + Myfiles Application + + org.tizen.myfile.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.tizen.myfile.manifest b/org.tizen.myfile.manifest new file mode 100644 index 0000000..9c925cb --- /dev/null +++ b/org.tizen.myfile.manifest @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/org.tizen.myfile.rule b/org.tizen.myfile.rule new file mode 100755 index 0000000..2379224 --- /dev/null +++ b/org.tizen.myfile.rule @@ -0,0 +1,214 @@ +org.tizen.myfile system::vconf rwxat +org.tizen.myfile system::homedir rwxat +org.tizen.myfile system::media rwxat +org.tizen.myfile system::home rwxat +org.tizen.myfile system::share rwxat +org.tizen.myfile pulseaudio rwxat +org.tizen.myfile device::video rw--- +org.tizen.myfile system::crash -wx-- +org.tizen.myfile system::use_internet rwxat +org.tizen.myfile ail::db rw--- +org.tizen.myfile media-data::db rw--- +org.tizen.myfile app-svc::db rw--- +org.tizen.myfile email-service::db rw--- +org.tizen.myfile org.tizen.indicator rwx-- +org.tizen.myfile org.tizen.message rwx-- +org.tizen.myfile org.tizen.cluster-home rwx-- +org.tizen.myfile org.tizen.setting rwx-- +org.tizen.myfile org.tizen.email rwx-- +org.tizen.myfile wifi_direct_manager rw--- +org.tizen.myfile power_manager rwx-- +org.tizen.myfile email-service rwx-- +org.tizen.myfile media-server rwx-- +org.tizen.myfile contacts-service rwx-- +org.tizen.myfile sound_server rwx-- +org.tizen.myfile msg-service rwx-- +org.tizen.myfile thumb-server rw--- +org.tizen.myfile system-server rwxa- +org.tizen.myfile mdm-server rwx-- +org.tizen.myfile efreet r-x-- +org.tizen.myfile xorg rwx-- +org.tizen.myfile isf rwx-- +org.tizen.myfile dbus rwxat +org.tizen.myfile nfc-manager rwx-- +org.tizen.myfile pkgmgr::db rw--- +org.tizen.myfile syslogd rwx-- +org.tizen.myfile data-provider-master::shortcut rw--- +org.tizen.myfile data-provider-master::shortcut.shortcut -w--- +org.tizen.myfile data-provider-master::utility rw--- +org.tizen.myfile data-provider-master::notification rw--- +org.tizen.myfile data-provider-master::notification.client -w--- +org.tizen.myfile data-provider-master::badge rw--- +org.tizen.myfile data-provider-master::badge.client -w--- +org.tizen.myfile crash-worker r-x-- +org.tizen.myfile net.wifi-qs rwx-- +org.tizen.myfile sys-assert::info -wx-- +org.tizen.myfile sys-assert::core rwxat +org.tizen.myfile cbhm rwx-- +org.tizen.myfile drmfw rw--- +org.tizen.myfile deviced rwxa- +org.tizen.myfile org.tizen.admin-data rw--- +org.tizen.myfile org.tizen.setting::default-resources r-x-- +e17 org.tizen.myfile rw--- +system::use_internet org.tizen.myfile -w--- +org.tizen.data-provider-slave org.tizen.myfile rwx-- +org.tizen.contacts org.tizen.myfile rwx-- +org.tizen.email org.tizen.myfile rwx-- +org.tizen.app-tray org.tizen.myfile r-x-- +org.tizen.music-player org.tizen.myfile rwx-- +org.tizen.volume org.tizen.myfile --x-- +org.tizen.quickpanel org.tizen.myfile --x-- +org.tizen.lockscreen org.tizen.myfile --x-- +org.tizen.cluster-home org.tizen.myfile r-x-- +context-service org.tizen.myfile r-x-- +media-server org.tizen.myfile -w--- +nfc-share-service org.tizen.myfile rw--- +isf org.tizen.myfile r-x-- +net.wifi-qs org.tizen.myfile --x-- +org.tizen.image-viewer org.tizen.myfile rwx-- +org.tizen.dailybriefing-agent org.tizen.myfile --x-- +org.tizen.indicator org.tizen.myfile --x-- +org.tizen.miniapp-tray org.tizen.myfile --x-- +org.tizen.add-viewer org.tizen.myfile --x-- +org.tizen.draglock org.tizen.myfile --x-- +org.tizen.menu-screen org.tizen.myfile --x-- +felicalock org.tizen.myfile --x-- +net.netpopup org.tizen.myfile --x-- +org.tizen.lowbat-syspopup org.tizen.myfile --x-- +org.tizen.app-selector org.tizen.myfile --x-- +org.tizen.myfile xorg::screencapture r---- +org.tizen.myfile system::vconf rwxat +org.tizen.myfile contacts-service::db rwx-- +org.tizen.myfile device::app_logging -w--- +org.tizen.myfile csc-manager rwx-- +org.tizen.myfile org.tizen.smemo rwx-- +org.tizen.myfile org.tizen.gallery rwxa- +org.tizen.myfile ims-service::db rw--- +org.tizen.myfile system::vconf_inhouse rwxat +org.tizen.myfile system::vconf_setting rwxat +org.tizen.myfile system::vconf_system rw--- +org.tizen.myfile contacts-service::svc rw--- +org.tizen.myfile ug-msg-composer-efl rwxat +org.tizen.myfile contacts-service::phonelog rw--- +org.tizen.myfile msg-service::read rw--- +org.tizen.myfile msg-service::write rw--- +org.tizen.myfile msg-service::wappush rw--- +org.tizen.myfile telephony_framework::api_manager r---- +org.tizen.myfile telephony_framework::api_modem -w--- +org.tizen.myfile org.tizen.gallery::web-media.db rwx-- +org.tizen.myfile org.tizen.gallery::gallery-media.db rwx-- +org.tizen.myfile org.tizen.gallery-service rwx-- +org.tizen.myfile org.tizen.contacts rwx-- +org.tizen.myfile ug-image-viewer-efl rwxat +org.tizen.myfile download-provider rw--- +org.tizen.myfile data-provider-master rw--- +org.tizen.myfile allshare::svc rwx-- +org.tizen.myfile net-config r-x-- +org.tizen.myfile pkgmgr r---- +org.tizen.myfile org.tizen.myfile rw--- +org.tizen.myfile dali rwxat +org.tizen.myfile cloud-content-sync::db rw--- +org.tizen.myfile cloud-content-sync rwx-- +org.tizen.myfile device::hwcodec rw--- +org.tizen.myfile org.tizen.gallery::face-svc.db rwx-- +org.tizen.myfile ug-email-viewer-efl rwx-- +org.tizen.myfile ug-email-docsearch-efl --x-- +org.tizen.myfile camera-external-engine rw--- +org.tizen.myfile system::vconf_inouse r---- +org.tizen.myfile system::vconf_privacy rw--- +org.tizen.myfile system::vconf_multimedia rw--- +org.tizen.myfile system::vconf_network rw--- +org.tizen.myfile system::vconf_misc rw--- +aul org.tizen.myfile rwx-- +org.tizen.gallery-service org.tizen.myfile rwx-- +org.tizen.cluster-home ug-image-viewer-efl r-x-- +org.tizen.lockscreen ug-image-viewer-efl r-x-- +org.tizen.myfile smemo::db rw--- +org.tizen.myfile org.tizen.browser rw--- +org.tizen.myfile org.tizen.image-editor r---- +org.tizen.myfile org.tizen.calendar rwx-- +org.tizen.myfile calendar-service rwx-- +org.tizen.myfile device::sys_logging -w--- +org.tizen.myfile webkit2-efl r-x-- +org.tizen.myfile resman::db rw--- +org.tizen.myfile map-efl rwxat +org.tizen.myfile ug-email-composer-efl rwxat +org.tizen.myfile ui-gadget::client --x-- +org.tizen.myfile secure-storage::pkcs12 r---- +org.tizen.myfile email-service::write rw--- +org.tizen.myfile calendar-service::svc rw--- +org.tizen.myfile ug_bluetooth r-x-- +org.tizen.myfile syspopup::db rwx-- +org.tizen.myfile bt-service::admin -w--- +org.tizen.myfile bt-service::gap -w--- +org.tizen.myfile bt-service::manager -w--- +org.tizen.myfile system::app_logging -w--- +org.tizen.myfile svi-data rwxat +org.tizen.myfile immvibed rwx-- +org.tizen.myfile libaccounts-svc::db rw--- +org.tizen.myfile org.tizen.volume rwx-- +org.tizen.myfile device::camera rw--- +org.tizen.myfile device::mdnie rw--- +org.tizen.myfile location_fw::client rwx-- +org.tizen.myfile pkgmer::db r---- +org.tizen.myfile stt-server rwx-- +org.tizen.myfile tts-server rwx-- +org.tizen.myfile ug-camera-efl rwxat +org.tizen.myfile vcs-server rwx-- +org.tizen.myfile image-filter-d::db rw--- +org.tizen.myfile location_fw::db rw--- +org.tizen.myfile pkgmgr::db rw--- +org.tizen.myfile org.tizen.svoice rwx-- +org.tizen.myfile org.tizen.dropbox r-x-- +org.tizen.myfile org.tizen.facebook r-x-- +org.tizen.myfile oma-ds-agent rwx-- +oma-ds-agent org.tizen.myfile rwx-- +org.tizen.myfile oma-ds-agent::cfg rwxat +org.tizen.setting org.tizen.myfile r-x-- +org.tizen.setting oma-ds-agent::cfg rwx-- +system::use_internet oma-ds-agent rwx-- +oma-ds-agent system::use_internet rwx-- +org.tizen.myfile syslogd rwx-- +org.tizen.myfile e17 r---- +org.tizen.myfile dlogutil r-x-- +org.tizen.myfile telephony_framework r-x-- +org.tizen.myfile aul r-x-- +org.tizen.myfile ode r-x-- +org.tizen.myfile sensor-framework r-x-- +org.tizen.myfile secure-storage r-x-- +org.tizen.myfile starter r-x-- +org.tizen.myfile osp-app-service r-x-- +org.tizen.myfile osp-security-service r-x-- +org.tizen.myfile osp-channel-service r-x-- +org.tizen.myfile org.tizen.app-tray r-x-- +org.tizen.myfile org.tizen.quickpanel r-x-- +org.tizen.myfile connman rwx-- +org.tizen.myfile mobicore-daemon r-x-- +org.tizen.myfile alarm-server rwx-- +org.tizen.myfile brcm_daemon r-x-- +org.tizen.myfile resman r-x-- +org.tizen.myfile osp-connectivity-service rwx-- +org.tizen.myfile push-service rwx-- +org.tizen.myfile eas-engine rwx-- +org.tizen.myfile org.tizen.data-provider-slave rwx-- +org.tizen.myfile org.tizen.data-provider-slave rwx-- +org.tizen.myfile usb-server rwx-- +org.tizen.myfile mtp-responder rwx-- +org.tizen.myfile sdbd rwx-- +org.tizen.myfile org.tizen.volume rwx-- +ui-gadget::client oma-ds-agent::svc rw--- +org.tizen.myfile samsung-account-front r-x-- +org.tizen.myfile worldclock::db rw--- +org.tizen.myfile location_fw::client rwx-- +org.tizen.myfile org.tizen.smartsearch --x-- +org.tizen.myfile ug-map-efl rwxat +org.tizen.myfile obexd r-x-- +org.tizen.myfile org.tizen.fileshare-service rwxat +org.tizen.fileshare-service org.tizen.myfile r-x-- +org.tizen.myfile nfc-manager::p2p rwx-- +org.tizen.myfile nfc-manager::admin rwx-- +org.tizen.myfile ug-setting-gallery-efl rwxat +org.tizen.myfile org.tizen.music-player --x-- +org.tizen.myfile phone-misc::db rw--- +org.tizen.myfile msg-service::db rw--- +org.tizen.myfile ug-msg-viewer-efl rwxat diff --git a/packaging/org.tizen.myfile.spec b/packaging/org.tizen.myfile.spec new file mode 100755 index 0000000..08b5096 --- /dev/null +++ b/packaging/org.tizen.myfile.spec @@ -0,0 +1,83 @@ +#sbs-git:slp/pkgs/m/myfiles myfiles 0.1.6 2caccae458123f3effccfcf34469f363593d375e +Name: org.tizen.myfile +Summary: Myfile Application v1.0 +Version: 0.2.10 +Release: 1 +Group: TO_BE/FILLED_IN +License: Flora +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gthread-2.0) +BuildRequires: pkgconfig(drm-client) +BuildRequires: pkgconfig(ui-gadget-1) +BuildRequires: pkgconfig(libmedia-service) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(ecore-imf) +BuildRequires: pkgconfig(ecore-x) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(ecore-file) +BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(icu-i18n) +BuildRequires: pkgconfig(icu-io) +BuildRequires: pkgconfig(icu-le) +BuildRequires: pkgconfig(icu-lx) +BuildRequires: pkgconfig(icu-uc) +BuildRequires: pkgconfig(capi-system-power) +BuildRequires: pkgconfig(capi-system-runtime-info) +BuildRequires: pkgconfig(capi-content-media-content) +BuildRequires: pkgconfig(capi-network-nfc) +BuildRequires: pkgconfig(capi-system-sensor) +BuildRequires: pkgconfig(syspopup-caller) +BuildRequires: pkgconfig(status) + +BuildRequires: cmake +BuildRequires: edje-bin +BuildRequires: embryo-bin +BuildRequires: gettext-devel + +%description +Myfile Application v1.0. + +%prep +%setup -q + +%define PREFIX "/usr/apps/org.tizen.myfile" +%define RESDIR "/usr/apps/org.tizen.myfile/res" +%define DATADIR "/opt/usr/apps/org.tizen.myfile/data" + +%build +cmake . -DCMAKE_INSTALL_PREFIX="%{PREFIX}" -DCMAKE_DESKTOP_ICON_DIR="/usr/share/icons/default/small" -DCMAKE_DESKTOP_DIR="/usr/share/applications" -DCMAKE_INSTALL_PKG_NAME="%{name}" -DCMAKE_INSTALL_DATA_DIR="%{DATADIR}" +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +cp LICENSE.Flora %{buildroot}/usr/share/license/%{name} +%make_install + +%post +chown -R 5000:5000 /opt/usr/apps/org.tizen.myfile/data + +/usr/bin/vconftool set -t int db/private/org.tizen.myfile/list_by 7 -i -g 5000 -f +/usr/bin/vconftool set -t int db/private/org.tizen.myfile/view_style 0 -i -g 5000 -f +/usr/bin/vconftool set -t int db/private/org.tizen.myfile/extension_state 1 -i -g 5000 -f +/usr/bin/vconftool set -t string db/private/org.tizen.myfile/recent_file "" -s -g 5000 -f + +%files +%manifest org.tizen.myfile.manifest +%defattr(-,root,root,-) +/opt/etc/smack/accesses.d/org.tizen.myfile.rule +/usr/apps/org.tizen.myfile/bin/myfile +/usr/apps/org.tizen.myfile/res/locale/* +/usr/apps/org.tizen.myfile/res/images/* +/usr/apps/org.tizen.myfile/res/edje/* +/opt/usr/apps/org.tizen.myfile/data +/usr/share/packages/* +/usr/share/icons/default/small/org.tizen.myfile.png +/usr/share/license/%{name} diff --git a/src/common/file-operation/mf-cancel.c b/src/common/file-operation/mf-cancel.c new file mode 100644 index 0000000..729b273 --- /dev/null +++ b/src/common/file-operation/mf-cancel.c @@ -0,0 +1,90 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include "mf-cancel.h" + + + +mf_cancel *mf_cancel_new(void) +{ + mf_cancel *cancel = NULL; + + cancel = g_new0(mf_cancel, 1); + if (cancel) { + cancel->is_cancel = FALSE; + cancel->do_cancel = FALSE; + g_static_mutex_init(&cancel->s_mutex); + } + return cancel; +} + +void mf_cancel_free(mf_cancel *cancel) +{ + if (cancel) { + cancel->is_cancel = FALSE; + g_static_mutex_free(&cancel->s_mutex); + } + return; +} + +void mf_cancel_do_cancel(mf_cancel *cancel) +{ + if (cancel) { + g_static_mutex_lock(&cancel->s_mutex); + cancel->do_cancel = TRUE; + g_static_mutex_unlock(&cancel->s_mutex); + } + return; +} + +gboolean mf_cancel_check_cancel(mf_cancel *cancel) +{ + gboolean do_cancel = FALSE; + if (cancel) { + g_static_mutex_lock(&cancel->s_mutex); + if (cancel->do_cancel) + do_cancel = TRUE; + g_static_mutex_unlock(&cancel->s_mutex); + } + return do_cancel; +} + + +void mf_cancel_set_cancelled(mf_cancel *cancel) +{ + if (cancel) { + g_static_mutex_lock(&cancel->s_mutex); + cancel->is_cancel = TRUE; + g_static_mutex_unlock(&cancel->s_mutex); + } + return; +} + +gboolean mf_cancel_is_cancelled(mf_cancel *cancel) +{ + gboolean is_cancelled = FALSE; + if (cancel) { + g_static_mutex_lock(&cancel->s_mutex); + if (cancel->is_cancel) + is_cancelled = TRUE; + g_static_mutex_unlock(&cancel->s_mutex); + } + return is_cancelled; +} diff --git a/src/common/file-operation/mf-copy-internal.c b/src/common/file-operation/mf-copy-internal.c new file mode 100644 index 0000000..40f8de4 --- /dev/null +++ b/src/common/file-operation/mf-copy-internal.c @@ -0,0 +1,821 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-copy-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-media-content.h" +#include "mf-fo-debug.h" + +struct _mf_copy_handle_intenal { + GList *src_items; + char *dst_dir; + mf_cancel *cancel; + void *u_data; + Ecore_Pipe *pipe; + gboolean sync; + + GMutex *lock; + GCond *cond; + + mf_fo_msg msg; + mf_fo_request *req; +}; + +GSList *copy_list = NULL; + +#ifndef SAFE_FREE +#define SAFE_FREE(x) do {\ + if ((x) != NULL) {\ + free(x); x = NULL;\ + } \ + } while (0) +#endif + +#define MSG_REPORT_PERIOD (1) +#define DEF_ALLLOC_SIZE 16384 /*((4)*(1024))*/ +#define DIR_MODE_BIT (01777) +#define FILE_MODE_BIT (S_IRWXU | S_IRWXG | S_IRWXO) +#define PER_HANDLE_MAX_SIZE (10*1024*1204) +#define PER_HANDLE_MIN_SIZE (1024*1024) + + +static gchar *__mf_copy_change_root_name(const char *name, const char *old_root, const char *new_root) +{ + gchar *new_name = NULL; + + if (name && old_root && new_root) { + int old_len = strlen(old_root); + int new_len = strlen(new_root); + int name_len = strlen(name); + const char *base = NULL; + GString *n = NULL; + + if ((strstr(name, old_root) == NULL) + || (name_len <= old_len) + || ((name[old_len] == '/' && name[old_len + 1] == '\0')) + || FALSE) { + mf_fo_loge("invaild args - name : [%s], old_root : [%s]", name, old_root); + return NULL; + } + + base = name + old_len; + if (name[old_len] == '/') { + base += 1; + } + + n = g_string_new(new_root); + if (n) { + if (n->str[new_len - 1] == '/') { + g_string_append_printf(n, "%s", base); + } else { + g_string_append_printf(n, "/%s", base); + } + new_name = g_string_free(n, FALSE); + } + } + return new_name; +} + + +int _mf_copy_copy_regfile(const char *src, struct stat *src_statp, const char *dst, unsigned long buf_size, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, + void *msg_data) +{ + FO_TRACE_BEGIN; + FILE *src_f = NULL; + FILE *dst_f = NULL; + void *buf = NULL; + unsigned long alloc_size = DEF_ALLLOC_SIZE; + ssize_t r_size = 0; + mode_t src_mode = 0; + int err = 0; + char err_buf[MF_ERR_BUF] = { 0, }; + + if (!src) { + mf_fo_loge("check argument src"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + if (!dst) { + mf_fo_loge("check argument dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (src_statp) { + src_mode = src_statp->st_mode; + } else { + struct stat src_info; + if (stat(src, &src_info)) { + mf_fo_loge("Fail to stat src file : %s", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + src_mode = src_info.st_mode; + } + + + if (!S_ISREG(src_mode)) { + mf_fo_loge("src[%s] is not regular file", src); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + src_f = fopen(src, "rb"); + if (!src_f) { + mf_fo_loge("Fail to fopen %s file", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + + dst_f = fopen(dst, "wb"); + if (!dst_f) { + mf_fo_loge("Fail to fopen %s file", dst); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + if (buf_size == 0) { + struct stat dst_info; + if (stat(dst, &dst_info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat dst file", dst); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + if (dst_info.st_blksize > 0) { + alloc_size = dst_info.st_blksize; + } + } else { + alloc_size = buf_size; + } + alloc_size = DEF_ALLLOC_SIZE; + + buf = malloc(alloc_size); + if (!buf) { + mf_fo_loge("fail to alloc buf, alloc_size : %lu", alloc_size); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + + int count = 0; + ssize_t msg_size = 0; + + struct _mf_copy_handle_intenal *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle_intenal *)msg_data; + mf_debug("cp_handle->msg.total_size=%lld", cp_handle->msg.total_size); + int dynamic_size = 0; + if (cp_handle->msg.total_size > PER_HANDLE_MAX_SIZE) { + dynamic_size = 64; + } else if (cp_handle->msg.total_size <= PER_HANDLE_MAX_SIZE && + cp_handle->msg.total_size > PER_HANDLE_MIN_SIZE) { + dynamic_size = 8; + } else { + dynamic_size = 1; + } + + while ((r_size = fread(buf, 1, alloc_size, src_f)) > 0) + { + ssize_t total = r_size; + void *buf_p = buf; + + count++; + while (total > 0) { + ssize_t w_size = 0; + w_size = fwrite(buf_p, 1, total, dst_f); + if (ferror(dst_f) != 0 || (r_size != w_size)) { + MF_FILE_ERROR_LOG(err_buf, "fail to write", dst_f); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + + buf_p += w_size; + total -= w_size; + } + if (cancel && mf_cancel_check_cancel(cancel)) { + goto CANCEL_CLOSE_FD; + } + + if (count == dynamic_size && msg_cb) { + msg_size += r_size; + msg_cb(MF_MSG_DOING, src, msg_size, 0, msg_data); + msg_size = 0; + } else { + msg_size += r_size; + } + + count = count % dynamic_size; + //g_usleep(10000); + } + + if (msg_size > 0 && msg_cb) { + msg_size += r_size; + msg_cb(MF_MSG_DOING, src, msg_size, 0, msg_data); + msg_size = 0; + } + + free(buf); + + fclose(src_f); + fclose(dst_f); + mf_fo_logd("success to copy file %s to %s", src, dst); + + return 0; + +ERROR_CLOSE_FD: + + + if (src_f) { + fclose(src_f); + src_f = NULL; + } + if (dst_f) { + fclose(dst_f); + dst_f = NULL; + remove(dst); + } + if (buf) { + free(buf); + } + return err; + + +CANCEL_CLOSE_FD: + if (buf) { + free(buf); + } + if (src_f) { + fclose(src_f); + src_f = NULL; + } + if (dst_f) { + fclose(dst_f); + dst_f = NULL; + remove(dst); + } + return 1; +} + +static int __get_copy_directory_hierarchies( const char *pathname, const struct stat *statptr, int type) +{ + mf_fo_dir_list_info *info = NULL; + mf_debug("pathname is [%s]\t type is [%d]\t", + pathname, type); + + switch (type) { + + case FTW_F: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + copy_list = g_slist_append(copy_list, info); + mf_debug("File pathname is [%s]", pathname); + break; + case FTW_D: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + copy_list = g_slist_append(copy_list, info); + mf_debug("Directory pathname is [%s]", pathname); + //process file + break; + default: + mf_debug("Default pathname is [%s]", pathname); + } + + return 0; +} + +int _mf_copy_copy_directory(const char *src, struct stat *src_statp, const char *dst, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data) +{ + int ret = -1; + mode_t src_mode = 0; + int err = 0; + char err_buf[MF_ERR_BUF] = { 0, }; + if (!src) { + mf_fo_loge("check argument src"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + if (!dst) { + mf_fo_loge("check argument dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (src_statp) { + src_mode = src_statp->st_mode; + } else { + struct stat src_info; + if (stat(src, &src_info)) { + mf_fo_loge("Fail to stat src file : %s", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + src_mode = src_info.st_mode; + } + + if (access(dst, F_OK)) { + if (mkdir(dst, (src_mode & DIR_MODE_BIT))) { + MF_FILE_ERROR_LOG(err_buf, "Fail to make directory", dst); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + return err; + } else { + if (msg_cb) { + msg_cb(MF_MSG_DOING, dst, MF_VISUAL_FOLDER_SIZE, 0, msg_data); + } + } + } else { + mf_fo_logd("directory[%s] is already existed", dst); + } + + ret = ftw(src, __get_copy_directory_hierarchies, 16); + if (ret == 0) { + mf_debug(); + mf_fo_dir_list_info *ent = NULL; + GSList *list = NULL; + list = copy_list; + while (list) { + if (cancel && mf_cancel_check_cancel(cancel)) { + goto DO_CANCEL; + } + ent = (mf_fo_dir_list_info *)list->data; + mf_debug("name is [%s] type is [%d]", ent->ftw_path, ent->type); + if (ent->type == FTW_D) { + if (ent->ftw_path == NULL || strlen(ent->ftw_path) == 0) { + list = g_slist_next(list); + continue; + } + if (g_strcmp0(ent->ftw_path, src) == 0) { + list = g_slist_next(list); + continue; + } + char *new_dir = __mf_copy_change_root_name(ent->ftw_path, src, dst); + mf_fo_logi("copy dir %s to %s", ent->ftw_path, new_dir); + if (new_dir) { + if (!_mf_fo_check_exist(new_dir)) { + struct stat info; + if (stat(ent->ftw_path, &info) == 0) { + if (mkdir(new_dir, (info.st_mode & DIR_MODE_BIT))) { + /* fts_set(fts, ent, FTS_SKIP); */ + mf_fo_loge("Fail to make directory [%s]", new_dir); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } else { + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat ", ent->ftw_path); + /* fts_set(fts, ent, FTS_SKIP); */ + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, ent->ftw_path, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } + } else { + struct stat new_dst_info; + if (stat(new_dir, &new_dst_info) == 0) { + if (S_ISDIR(new_dst_info.st_mode)) { + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } else { + mf_fo_loge("[%s] is already existed, and this one is not directory", new_dir); + /*set FTS_SKIP to skip children of current*/ + /*fts_set(fts, ent, FTS_SKIP);*/ + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat ", new_dir); + /*fts_set(fts, ent, FTS_SKIP);*/ + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } + } + free(new_dir); + } else { + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + } else if (ent->type == FTW_F) { + if (ent->ftw_path == NULL || strlen(ent->ftw_path) == 0) { + list = g_slist_next(list); + continue; + } + char *new_file = __mf_copy_change_root_name(ent->ftw_path, src, dst); + if (new_file) { + err = _mf_copy_copy_regfile(ent->ftw_path, NULL, new_file, 0, cancel, msg_cb, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_file); + } + free(new_file); + if (err > 0) { + goto DO_CANCEL; + } else if (err < 0) { + goto ERROR_CLOSE_FD; + } + } else { + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + } + mf_debug("ent->path is [%s]", ent->ftw_path); + list = g_slist_next(list); + } + + } else { + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + _mf_fo_free_directory_hierarchies(©_list); + return err; + + } + _mf_fo_free_directory_hierarchies(©_list); + return 0; + +ERROR_CLOSE_FD: + _mf_fo_free_directory_hierarchies(©_list); + return err; + +DO_CANCEL: + _mf_fo_free_directory_hierarchies(©_list); + return 1; +} + +int _mf_copy_copy_internal(const char *src, const char *dst_dir, mf_cancel *cancel, _mf_fo_msg_cb msg_func, mf_req_callback req_func, void *msg_data) +{ + int err = 0; + char *src_basename = NULL; + char *new_dst = NULL; + char *next_name = NULL; + int base_size = 0; + int root_size = 0; + int with_slash = 1; + int alloc_size = 1; /*for null*/ + struct stat src_info; + char err_buf[MF_ERR_BUF] = { 0, }; + + if (!src || strlen(src) <= 1) { + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (!dst_dir) { + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (access(dst_dir, R_OK | W_OK)) { + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_PERMISSION); + if (msg_func) { + msg_func(MF_MSG_ERROR, dst_dir, 0, err, msg_data); + } + return err; + } + + if (stat(src, &src_info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat src ", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_func) { + msg_func(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + + if (S_ISDIR(src_info.st_mode)) { + if (g_strcmp0(dst_dir, src) == 0) { + mf_fo_loge("dst is child of src - src : %s, dst : %s", src, dst_dir); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_func) { + msg_func(MF_MSG_ERROR, dst_dir, 0, err, msg_data); + } + return err; + } + } + src_basename = g_path_get_basename(src); + if (!src_basename) { + mf_fo_loge("fail to get basename from src[%s]", src); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + base_size = strlen(src_basename); + root_size = strlen(dst_dir); + + if (dst_dir[root_size - 1] != '/') { + alloc_size += 1; + with_slash = 0; + } + + alloc_size += (base_size + root_size); + + new_dst = malloc(sizeof(char) * (alloc_size)); + if (!new_dst) { + mf_fo_loge("fail to alloc new dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + + if (with_slash) { + snprintf(new_dst, alloc_size, "%s%s", dst_dir, src_basename); + } else { + snprintf(new_dst, alloc_size, "%s/%s", dst_dir, src_basename); + } + SAFE_FREE(src_basename); + + if (cancel && mf_cancel_check_cancel(cancel)) { + goto CANCEL_FREE_MEM; + } + + if (access(new_dst, F_OK)) { + if (S_ISDIR(src_info.st_mode)) { + err = _mf_copy_copy_directory(src, &src_info, new_dst, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_folder(new_dst); + } + } else if (S_ISREG(src_info.st_mode)) { + /*just copy*/ + err = _mf_copy_copy_regfile(src, &src_info, new_dst, 0, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_dst); + } + } else { + mf_fo_loge("item[%s] is not file or directory", src); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE | MF_FO_ERR_REPORT_CLASS); + if (msg_func) { + msg_func(MF_MSG_ERROR, src, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + } else { + mf_request_type result = MF_REQ_NONE; + if (req_func) { + mf_fo_request *req = mf_request_new(); + if (req) { + mf_request_set_path(req, new_dst); + mf_fo_logd("~~~~~~ waiting for request"); + req_func(req, msg_data); + result = mf_request_get_result(req); + mf_fo_logd("~~~~~~ get request : %d", result); + if (result == MF_REQ_RENAME) { + next_name = mf_request_get_new_name(req); + } + mf_request_free(req); + } else { + mf_fo_loge("Fail to alloc request"); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + } + + switch (result) { + case MF_REQ_NONE: + case MF_REQ_MERGE: + { + struct stat dst_info; + if (stat(new_dst, &dst_info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat new_dst ", new_dst); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, errno, msg_data); + } + goto ERROR_FREE_MEM; + } + + if (S_ISDIR(src_info.st_mode)) { + if (!S_ISDIR(dst_info.st_mode)) { + mf_fo_loge("src[%s] is directory, but dst[%s] is already existed and not a directory", src, new_dst); + + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_TYPE); + if (msg_func) { + msg_func(MF_MSG_ERROR, new_dst, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + /*just copy*/ + err = _mf_copy_copy_directory(src, &src_info, new_dst, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_folder(new_dst); + } + } else if (S_ISREG(src_info.st_mode)) { + if (!S_ISREG(dst_info.st_mode)) { + mf_fo_loge("src[%s] is file, but dst[%s] is already existed and not a file", src, new_dst); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_TYPE); + if (msg_func) { + msg_func(MF_MSG_ERROR, new_dst, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + /*just copy*/ + err = _mf_copy_copy_regfile(src, &src_info, new_dst, dst_info.st_blksize, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_dst); + } + } + + } + break; + case MF_REQ_RENAME: + { + if (next_name) { + if (S_ISDIR(src_info.st_mode)) { + err = _mf_copy_copy_directory(src, &src_info, next_name, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_folder(next_name); + } + } else if (S_ISREG(src_info.st_mode)) { + err = _mf_copy_copy_regfile(src, &src_info, next_name, 0, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_file(next_name); + } + } + SAFE_FREE(next_name); + } else { + if (S_ISDIR(src_info.st_mode)) { + int errcode = 0; + next_name = _mf_fo_get_next_unique_dirname(new_dst, &errcode); + if (!next_name) { + mf_fo_loge("Fail to get next directory name [%s]", new_dst); + err = (_mf_fo_errno_to_mferr(errcode) | MF_FO_ERR_DST_CLASS); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_copy_copy_directory(src, &src_info, next_name, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_folder(next_name); + } + } else if (S_ISREG(src_info.st_mode)) { + int errcode = 0; + next_name = _mf_fo_get_next_unique_filename(new_dst, &errcode); + if (!next_name) { + mf_fo_loge("Fail to get next file name [%s]", new_dst); + err = (_mf_fo_errno_to_mferr(errcode) | MF_FO_ERR_DST_CLASS); + if (msg_func) { + msg_func(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_copy_copy_regfile(src, &src_info, next_name, 0, cancel, msg_func, msg_data); + if (err == 0) { + mf_media_content_scan_file(next_name); + } + } + SAFE_FREE(next_name); + } + } + break; + case MF_REQ_SKIP: + { + if (msg_func) { + unsigned long long size = 0; + /*1 TODO : Do i need to report error, if i fail to get size ?*/ + _mf_fo_get_total_item_size(src, &size); + msg_func(MF_MSG_SKIP, NULL, size, 0, msg_data); + } + } + break; + case MF_REQ_CANCEL: + { + if (cancel) { + mf_cancel_do_cancel(cancel); + } + goto CANCEL_FREE_MEM; + } + break; + default: + abort(); + break; + + } + } + SAFE_FREE(new_dst); + + if (err > 0) { + goto CANCEL_FREE_MEM; + } else if (err < 0) { + goto ERROR_FREE_MEM; + } + + return 0; + +ERROR_FREE_MEM: + mf_fo_logi("Copy error"); + SAFE_FREE(src_basename); + SAFE_FREE(new_dst); + + return err; + +CANCEL_FREE_MEM: + + mf_fo_logi("Copy cancelled"); + SAFE_FREE(new_dst); + SAFE_FREE(next_name); + + return 1; +} diff --git a/src/common/file-operation/mf-copy.c b/src/common/file-operation/mf-copy.c new file mode 100644 index 0000000..ae09dcd --- /dev/null +++ b/src/common/file-operation/mf-copy.c @@ -0,0 +1,464 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-copy.h" +#include "mf-copy-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-fo-debug.h" +#include "mf-callback.h" + +extern int flagMsg; +extern pthread_mutex_t gLockMsg; +extern pthread_cond_t gCondMsg; + + +struct _mf_copy_handle { + GList *src_items; + char *dst_dir; + mf_cancel *cancel; + void *u_data; + Ecore_Pipe *pipe; + gboolean sync; + + GMutex *lock; + GCond *cond; + + mf_fo_msg msg; + mf_fo_request *req; +}; + +static double __mf_copy_get_time(void) +{ + struct timeval timev; + + gettimeofday(&timev, NULL); + return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); +} + +static gboolean __mf_copy_msg_publish_callback(gpointer data) +{ + FO_TRACE_BEGIN; + struct _mf_copy_handle *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle *)data; + mf_fo_msg msg; + memset(&msg, 0, sizeof(mf_fo_msg)); + + MYFILE_MAGIC_SET(&msg, MYFILE_MAGIC_PIPE_DATA); + if (!cp_handle) { + goto EXIT; + } + + g_mutex_lock(cp_handle->lock); + msg.msg_type = cp_handle->msg.msg_type; + msg.error_code = cp_handle->msg.error_code; + msg.current = cp_handle->msg.current; + msg.current_index = cp_handle->msg.current_index; + msg.total_index = cp_handle->msg.total_index; + msg.current_size = cp_handle->msg.current_size; + msg.total_size = cp_handle->msg.total_size; + msg.current_real = cp_handle->msg.current_real; + msg.request = NULL; + msg.pipe = cp_handle->pipe; + g_mutex_unlock(cp_handle->lock); + + ecore_pipe_write(cp_handle->pipe, &msg, sizeof(msg)); + +EXIT: + FO_TRACE_END; + return FALSE; +} + +static void __mf_copy_msg_cb(mf_msg_type msg_type, const char *real, unsigned long long size, int error_code, void *data) +{ + struct _mf_copy_handle *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle *)data; + + pthread_mutex_lock(&gLockMsg); + while (flagMsg == 0) { + mf_fo_loge("!!!!!!!!!!!! wait"); + pthread_cond_wait(&gCondMsg, &gLockMsg); + } + flagMsg = 0; + pthread_mutex_unlock(&gLockMsg); + + if (cp_handle) { + g_mutex_lock(cp_handle->lock); + cp_handle->msg.msg_type = msg_type; + if (msg_type == MF_MSG_ERROR) { + cp_handle->msg.error_code = error_code; + if (real) { + if (cp_handle->msg.current_real) { + free(cp_handle->msg.current_real); + } + cp_handle->msg.current_real = strdup(real); + } + } else { + cp_handle->msg.error_code = 0; + if (msg_type == MF_MSG_DOING) { + if (real) { + if (cp_handle->msg.current_real) { + free(cp_handle->msg.current_real); + } + cp_handle->msg.current_real = strdup(real); + } + cp_handle->msg.current_size += size; + cp_handle->msg.error_code = 0; + } else if (msg_type == MF_MSG_SKIP) { + cp_handle->msg.total_size -= size; + cp_handle->msg.error_code = 0; + } + } + g_mutex_unlock(cp_handle->lock); + + __mf_copy_msg_publish_callback(cp_handle); + } + FO_TRACE_END; + return; +} + +static gboolean __mf_copy_req_msg_callback(gpointer data) +{ + FO_TRACE_BEGIN; + + struct _mf_copy_handle *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle *)data; + mf_fo_msg msg; + memset(&msg, 0, sizeof(mf_fo_msg)); + + MYFILE_MAGIC_SET(&msg, MYFILE_MAGIC_PIPE_DATA); + if (!cp_handle) { + goto EXIT; + } + + g_mutex_lock(cp_handle->lock); + msg.msg_type = MF_MSG_REQUEST; + msg.error_code = cp_handle->msg.error_code; + msg.current = cp_handle->msg.current; + msg.current_index = cp_handle->msg.current_index; + msg.total_index = cp_handle->msg.total_index; + msg.current_size = cp_handle->msg.current_size; + msg.total_size = cp_handle->msg.total_size; + msg.current_real = cp_handle->msg.current_real; + msg.request = cp_handle->req; + g_mutex_unlock(cp_handle->lock); + ecore_pipe_write(cp_handle->pipe, &msg, sizeof(msg)); + +EXIT: + + FO_TRACE_END; + return FALSE; +} + +static void __mf_copy_req_cb(mf_fo_request *req, void *data) +{ + FO_TRACE_BEGIN; + struct _mf_copy_handle *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle *)data; + + if (cp_handle) { + + cp_handle->req = req; + mf_request_set_cond(req, cp_handle->cond); + __mf_copy_req_msg_callback(cp_handle); + g_mutex_lock(cp_handle->lock); + while (mf_request_flag_get(req)) { + g_cond_wait(cp_handle->cond, cp_handle->lock); + } + mf_request_flag_set(req, 1); + g_mutex_unlock(cp_handle->lock); + } + return; +} + +static void __mf_copy_free_handle(struct _mf_copy_handle *handle) +{ + if (handle) { + if (handle->lock) { + g_mutex_free(handle->lock); + } + if (handle->cond) { + g_cond_free(handle->cond); + } + if (handle->dst_dir) { + free(handle->dst_dir); + } + if (handle->src_items) { + g_list_foreach(handle->src_items, (GFunc) free, NULL); + g_list_free(handle->src_items); + } + if (handle->msg.current_real) { + g_free(handle->msg.current_real); + handle->msg.current_real = NULL; + } + free(handle); + } + + return; +} + +static void *__mf_copy_thread_func(void *data) +{ + FO_TRACE_BEGIN; + struct _mf_copy_handle *cp_handle = NULL; + cp_handle = (struct _mf_copy_handle *)data; + + gboolean cancelled = FALSE; + double s_start = 0.0; + double s_stop = 0.0; + double c_start = 0.0; + double c_stop = 0.0; + if (cp_handle) { + GList *tmp_src_list = NULL; + unsigned long long t_size = 0; + unsigned long long r_size = 0; + int errcode = 0; + + s_start = __mf_copy_get_time(); + tmp_src_list = cp_handle->src_items; + + errcode = _mf_fo_get_remain_space(cp_handle->dst_dir, &r_size); + if (errcode < 0) { + + __mf_copy_msg_cb(MF_MSG_ERROR, cp_handle->dst_dir, 0, (MF_FO_ERR_DST_CLASS | _mf_fo_errno_to_mferr(-errcode)), cp_handle); + + goto ERROR_END_THREAD; + } + + if (r_size == 0) { + int err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_SPACE); + __mf_copy_msg_cb(MF_MSG_ERROR, cp_handle->dst_dir, 0, err, cp_handle); + + goto ERROR_END_THREAD; + } + + + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + unsigned long long size = 0; + + s_path = tmp_src_list->data; + if (access(s_path, R_OK) == 0) { + errcode = _mf_fo_get_total_item_size(s_path, &size); + if (errcode < 0) { + mf_fo_loge("Fail to get size of %s", s_path); + + __mf_copy_msg_cb(MF_MSG_ERROR, s_path, 0, + (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(-errcode)), cp_handle); + + goto ERROR_END_THREAD; + } else { + mf_fo_logi("size of %s - %lld", s_path, size); + t_size += size; + } + } else { + mf_fo_loge("Unable to access [%s]. error - %s", s_path, strerror(errno)); + __mf_copy_msg_cb(MF_MSG_ERROR, s_path, 0, (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(errno)), cp_handle); + goto ERROR_END_THREAD; + } + } + tmp_src_list = g_list_next(tmp_src_list); + } + s_stop = __mf_copy_get_time(); + g_mutex_lock(cp_handle->lock); + cp_handle->msg.total_size = t_size; + g_mutex_unlock(cp_handle->lock); + + if (r_size < t_size) { + mf_fo_loge("total size [%lld], remain size [%lld] -[%s]", t_size, r_size, cp_handle->dst_dir); + + int err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_SPACE); + __mf_copy_msg_cb(MF_MSG_ERROR, cp_handle->dst_dir, 0, err, cp_handle); + + goto ERROR_END_THREAD; + } + /* copy items */ + c_start = __mf_copy_get_time(); + tmp_src_list = cp_handle->src_items; + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + s_path = tmp_src_list->data; + int ret = 0; + g_mutex_lock(cp_handle->lock); + cp_handle->msg.current_index++; + cp_handle->msg.current = s_path; + g_mutex_unlock(cp_handle->lock); + ret = _mf_copy_copy_internal(s_path, cp_handle->dst_dir, cp_handle->cancel, + __mf_copy_msg_cb, __mf_copy_req_cb, cp_handle); + + if (ret > 0) { + if (cp_handle->cancel) { + mf_cancel_set_cancelled(cp_handle->cancel); + } + cancelled = TRUE; + break; + } + if (ret < 0) { + mf_fo_loge("Fail to copy [%s] to [%s]", s_path, cp_handle->dst_dir); + break; + } + } + tmp_src_list = g_list_next(tmp_src_list); + } + c_stop = __mf_copy_get_time(); + mf_fo_logi("## Total src size - %lld byte, size time : %lf sec, copy time : %lf sec", + cp_handle->msg.total_size, s_stop - s_start, c_stop - c_start); + if (cancelled) { + __mf_copy_msg_cb(MF_MSG_CANCELLED, NULL, 0, 0, cp_handle); + } + +ERROR_END_THREAD: + if (cp_handle->sync) { + double start = 0.0; + double stop = 0.0; + + __mf_copy_msg_cb(MF_MSG_SYNC, NULL, 0, 0, cp_handle); + + start = __mf_copy_get_time(); + sync(); + stop = __mf_copy_get_time(); + mf_fo_logi("sync time : %lf sec", stop - start); + } + __mf_copy_msg_cb(MF_MSG_END, NULL, 0, 0, cp_handle); + __mf_copy_free_handle(cp_handle); + cp_handle = NULL; + } else { + mf_fo_loga("handle is NULL"); + abort(); + } + + mf_fo_logd("The end of __mf_copy_thread_func"); + return NULL; +} + +int mf_copy_copy_items(GList *item_list, const char *dst_dir, mf_cancel *cancel, gboolean sync, void *u_data) +{ + FO_TRACE_BEGIN; + struct _mf_copy_handle *cp_handle = NULL; + GList *tmp_list = NULL; + int err = 0; + + if (!item_list) { + mf_fo_loge("item_list is NULL"); + return -(MF_FO_ERR_ARGUMENT); + } + if (!dst_dir) { + mf_fo_loge("dst_dir is NULL"); + return -(MF_FO_ERR_ARGUMENT); + } + + if (!_mf_fo_check_exist(dst_dir)) { + mf_fo_loge("dst_dir[%s] is not existed", dst_dir); + return -(MF_FO_ERR_ARGUMENT); + } + + if (!g_thread_supported()) { + g_thread_init(NULL); + } + + cp_handle = malloc(sizeof(struct _mf_copy_handle)); + if (!cp_handle) { + mf_fo_loge("Fail to allocate handle"); + return -(MF_FO_ERR_MEM); + } + memset(cp_handle, 0x00, sizeof(struct _mf_copy_handle)); + + cp_handle->lock = g_mutex_new(); + if (!cp_handle->lock) { + mf_fo_loge("Fail to allocate mutex"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + cp_handle->cond = g_cond_new(); + if (!cp_handle->cond) { + mf_fo_loge("Fail to allocate cond"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + cp_handle->dst_dir = strdup(dst_dir); + if (!cp_handle->dst_dir) { + mf_fo_loge("Fail to allocate memory"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + cp_handle->cancel = cancel; + cp_handle->u_data = u_data; + cp_handle->sync = sync; + + pthread_mutex_lock(&gLockMsg); + flagMsg = 1; + pthread_mutex_unlock(&gLockMsg); + + tmp_list = item_list; + while (tmp_list) { + if (tmp_list->data) { + char *src_item = NULL; + src_item = strdup((char *)tmp_list->data); + if (src_item) { + if (_mf_fo_check_exist(src_item)) { + cp_handle->src_items = g_list_append(cp_handle->src_items, src_item); + } else { + mf_fo_loge("src_item[%s] is not existed", src_item); + err = MF_FO_ERR_ARGUMENT; + free(src_item); + src_item = NULL; + /* goto ERROR_FREE_MEM; */ + } + } else { + mf_fo_loge("Fail to allocate memory"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + } + tmp_list = g_list_next(tmp_list); + } + + if (!cp_handle->src_items) { + mf_fo_loge("Fail to create src list"); + err = MF_FO_ERR_ARGUMENT; + goto ERROR_FREE_MEM; + } + + cp_handle->pipe = ecore_pipe_add(mf_callback_thread_pipe_cb, u_data); + if (!g_thread_create((GThreadFunc) __mf_copy_thread_func, cp_handle, FALSE, NULL)) { + mf_fo_loge("Fail to create copy thread"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + return 0; + +ERROR_FREE_MEM: + __mf_copy_free_handle(cp_handle); + return -(err); +} diff --git a/src/common/file-operation/mf-delete-internal.c b/src/common/file-operation/mf-delete-internal.c new file mode 100644 index 0000000..1b38fa1 --- /dev/null +++ b/src/common/file-operation/mf-delete-internal.c @@ -0,0 +1,290 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include + +#include "mf-delete-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-fo-debug.h" +#include "mf-media-content.h" + +GSList *delete_list = NULL; + +#ifndef SAFE_FREE +#define SAFE_FREE(x) do {\ + if ((x) != NULL) {\ + free(x); \ + x = NULL;\ + } \ + } while (0) +#endif + +int _mf_delete_delete_regfile(const char *file, struct stat *file_statp, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data) +{ + mode_t mode = 0; + off_t size = 0; + int err = 0; + char err_buf[MF_ERR_BUF] = {0,}; + if (!file) { + mf_fo_loge("file is NULL"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (cancel && mf_cancel_check_cancel(cancel)) { + return 1; + } + + if (file_statp) { + mode = file_statp->st_mode; + size = file_statp->st_size; + } else { + struct stat info; + if (stat(file, &info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat file ", file); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, file, 0, err, msg_data); + } + return err; + } + mode = info.st_mode; + size = info.st_size; + } + + if (!S_ISREG(mode)) { + mf_fo_loge("[%s] is not regular file", file); + + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, file, 0, err, msg_data); + } + return err; + } + + if (remove(file)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to delete ", file); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, file, 0, err, msg_data); + } + return err; + } + + mf_fo_logd("success to delete FILE : %s", file); + /*success message*/ + if (msg_cb) { + msg_cb(MF_MSG_DOING, file, size, 0, msg_data); + } + + return 0; +} + +static int __get_delete_directory_hierarchies( const char *pathname, const struct stat *statptr, int type) +{ + mf_fo_dir_list_info *info = NULL; + mf_debug("pathname is [%s]\t type is [%d]\t", + pathname, type); + + switch (type) { + + case FTW_F: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + delete_list = g_slist_prepend(delete_list, info); + mf_debug("File pathname is [%s]", pathname); + break; + case FTW_D: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + delete_list = g_slist_prepend(delete_list, info); + mf_debug("Directory pathname is [%s]", pathname); + //process file + break; + default: + mf_debug("Default pathname is [%s]", pathname); + } + + return 0; +} + +int _mf_delete_delete_directory(const char *dir, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data) +{ + int err = 0; + int ret = -1; + char err_buf[MF_ERR_BUF] = {0,}; + if (!dir) { + mf_fo_loge("check argument dir"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + ret = ftw(dir, __get_delete_directory_hierarchies, 16); + if (ret == 0) { + mf_debug(); + mf_fo_dir_list_info *ent = NULL; + GSList *list = NULL; + list = delete_list; + while (list) { + if (cancel && mf_cancel_check_cancel(cancel)) { + goto DO_CANCEL; + } + ent = (mf_fo_dir_list_info *)list->data; + if (ent->type == FTW_F) { + if (ent->ftw_path == NULL || strlen(ent->ftw_path) == 0) { + list = g_slist_next(list); + continue; + } + err = _mf_delete_delete_regfile(ent->ftw_path, NULL, cancel, msg_cb, msg_data); + if (err == 0) { + mf_media_content_scan_file(ent->ftw_path); + } + if (err > 0) { + goto DO_CANCEL; + } else if (err < 0) { + goto ERROR_CLOSE_FD; + } + + } else if (ent->type == FTW_D) { + if (cancel && mf_cancel_check_cancel(cancel)) { + goto DO_CANCEL; + } + if (ent->ftw_path == NULL || strlen(ent->ftw_path) == 0) { + list = g_slist_next(list); + continue; + } + + if (remove(ent->ftw_path)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to delete ", ent->ftw_path); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, ent->ftw_path, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } else { + mf_fo_logd("success to delete DIR : %s", ent->ftw_path); + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } + } + mf_debug("ent->path is [%s]", ent->ftw_path); + list = g_slist_next(list); + } + } else { + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dir, 0, err, msg_data); + } + _mf_fo_free_directory_hierarchies(&delete_list); + return err; + } + + _mf_fo_free_directory_hierarchies(&delete_list); + + return 0; + +ERROR_CLOSE_FD: + _mf_fo_free_directory_hierarchies(&delete_list); + return err; + +DO_CANCEL: + _mf_fo_free_directory_hierarchies(&delete_list); + return 1; +} + +int _mf_delete_del_internal(const char *item, mf_cancel *cancel, _mf_fo_msg_cb msg_callback, void *msg_data) +{ + struct stat info; + int err = 0; + char err_buf[MF_ERR_BUF] = {0,}; + if (!item || strlen(item) <= 1) { + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (stat(item, &info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat item ", item); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, item, 0, err, msg_data); + } + return err; + } + + if (cancel && mf_cancel_check_cancel(cancel)) { + goto DO_CANCEL; + } + + if (S_ISDIR(info.st_mode)) { + err = _mf_delete_delete_directory(item, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_folder(item); + } + } else if (S_ISREG(info.st_mode)) { + err = _mf_delete_delete_regfile(item, &info, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_file(item); + } + } else { + + mf_fo_loge("item[%s] is not file or directory", item); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE | MF_FO_ERR_REPORT_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, item, 0, err, msg_data); + } + return err; + } + + if (err > 0) { + goto DO_CANCEL; + } else if (err < 0) { + goto ERROR_RETURN; + } + + return 0; + +ERROR_RETURN: + return err; + +DO_CANCEL: + return 1; +} diff --git a/src/common/file-operation/mf-delete.c b/src/common/file-operation/mf-delete.c new file mode 100644 index 0000000..592f48d --- /dev/null +++ b/src/common/file-operation/mf-delete.c @@ -0,0 +1,365 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-delete.h" +#include "mf-delete-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-fo-debug.h" +#include "mf-callback.h" + +extern int flagMsg; +extern pthread_mutex_t gLockMsg; +extern pthread_cond_t gCondMsg; + +struct _mf_del_handle { + GList *src_items; + mf_cancel *cancel; + void *u_data; + gboolean sync; + + GMutex *lock; + GCond *cond; + guint msg_idle_cb; + + mf_fo_msg msg; + Ecore_Pipe *pipe; +}; + +static double get_time(void) +{ + struct timeval timev; + + gettimeofday(&timev, NULL); + return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); +} + +static void __mf_delete_free_handle(struct _mf_del_handle *handle) +{ + if (handle) { + /*free cp_handle*/ + if (handle->lock) { + g_mutex_free(handle->lock); + } + if (handle->cond) { + g_cond_free(handle->cond); + } + if (handle->src_items) { + g_list_foreach(handle->src_items, (GFunc)free, NULL); + g_list_free(handle->src_items); + } + if (handle->msg.current_real) { + g_free(handle->msg.current_real); + handle->msg.current_real = NULL; + } + free(handle); + } + + return; +} + +static gboolean _del_msg_publish(gpointer data) +{ + struct _mf_del_handle *handle = NULL; + handle = (struct _mf_del_handle *)data; + mf_fo_msg msg; + + if (!handle) { + goto EXIT; + } + MYFILE_MAGIC_SET(&msg, MYFILE_MAGIC_PIPE_DATA); + + g_mutex_lock(handle->lock); + msg.msg_type = handle->msg.msg_type; + msg.error_code = handle->msg.error_code; + msg.current = handle->msg.current; + msg.current_index = handle->msg.current_index; + msg.total_index = handle->msg.total_index; + msg.current_size = handle->msg.current_size; + msg.total_size = handle->msg.total_size; + msg.current_real = handle->msg.current_real; + msg.pipe = handle->pipe; + g_mutex_unlock(handle->lock); + + /*pulish message*/ + ecore_pipe_write(handle->pipe, &msg, sizeof(msg)); + +EXIT: + return FALSE; +} + +static void _del_msg_cb(mf_msg_type msg_type, const char *real, unsigned long long size, int error_code, void *data) +{ + struct _mf_del_handle *handle = NULL; + handle = (struct _mf_del_handle *)data; + + pthread_mutex_lock(&gLockMsg); + while (flagMsg == 0) { + mf_fo_loge("!!!!!!!!!!!! wait"); + pthread_cond_wait(&gCondMsg, &gLockMsg); + } + flagMsg = 0; + pthread_mutex_unlock(&gLockMsg); + + if (handle) { + g_mutex_lock(handle->lock); + handle->msg.msg_type = msg_type; + if (msg_type == MF_MSG_ERROR) { + handle->msg.error_code = error_code; + if (real) { + if (handle->msg.current_real) { + free(handle->msg.current_real); + } + handle->msg.current_real = strdup(real); + } + } else { + handle->msg.error_code = 0; + if (msg_type == MF_MSG_DOING) { + if (real) { + if (handle->msg.current_real) { + free(handle->msg.current_real); + } + handle->msg.current_real = strdup(real); + } + handle->msg.current_size += size; + handle->msg.error_code = 0; + } else if (msg_type == MF_MSG_SKIP) { + handle->msg.total_size -= size; + handle->msg.error_code = 0; + } + } + g_mutex_unlock(handle->lock); + + _del_msg_publish(handle); + } + return; +} + + +static void *delete_thread(void *data) +{ + struct _mf_del_handle *handle = NULL; + handle = (struct _mf_del_handle *)data; + + _mf_fo_msg_cb msg_cb = NULL; + gboolean cancelled = FALSE; + double s_start = 0.0; + double s_stop = 0.0; + double c_start = 0.0; + double c_stop = 0.0; + char err_buf[MF_ERR_BUF] = { 0, }; + + if (handle) { + GList *tmp_src_list = NULL; + unsigned long long t_size = 0; + + msg_cb = _del_msg_cb; + + s_start = get_time(); + tmp_src_list = handle->src_items; + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + unsigned long long size = 0; + + s_path = tmp_src_list->data; + if (access(s_path, R_OK) == 0) { + int err = _mf_fo_get_total_item_size(s_path, &size); + if (err < 0) { + mf_fo_loge("Fail to get size of %s", s_path); + /*handle->src_items = g_list_remove(handle->src_items, s_path);*/ + + _del_msg_cb(MF_MSG_ERROR, s_path, 0, (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(-err)), handle); + + goto ERROR_END_THREAD; + } else { + mf_fo_logi("size of %s - %lld", s_path, size); + t_size += size; + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Unable to access ", s_path); + /*handle->src_items = g_list_remove(handle->src_items, s_path);*/ + + _del_msg_cb(MF_MSG_ERROR, s_path, 0, (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(errno)), handle); + + goto ERROR_END_THREAD; + } + } + tmp_src_list = g_list_next(tmp_src_list); + } + s_stop = get_time(); + g_mutex_lock(handle->lock); + handle->msg.total_size = t_size; + g_mutex_unlock(handle->lock); + + /*delete items*/ + c_start = get_time(); + tmp_src_list = handle->src_items; + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + s_path = tmp_src_list->data; + int ret = 0; + g_mutex_lock(handle->lock); + handle->msg.current_index++; + handle->msg.current = s_path; + g_mutex_unlock(handle->lock); + ret = _mf_delete_del_internal(s_path, handle->cancel, msg_cb, handle); + + if (ret > 0) { + if (handle->cancel) { + mf_cancel_set_cancelled(handle->cancel); + } + cancelled = TRUE; + break; + } + if (ret < 0) { + mf_fo_loge("Fail to delete [%s]", s_path); + } + } + tmp_src_list = g_list_next(tmp_src_list); + } + c_stop = get_time(); + mf_fo_logi("## Total src size - %lld byte, size time : %lf sec, delete time : %lf sec", + handle->msg.total_size, s_stop - s_start, c_stop - c_start); + + if (cancelled) { + /*cancel message*/ + _del_msg_cb(MF_MSG_CANCELLED, NULL, 0, 0, handle); + } + +ERROR_END_THREAD: + if (handle->sync) { + double start = 0.0; + double stop = 0.0; + _del_msg_cb(MF_MSG_SYNC, NULL, 0, 0, handle); + start = get_time(); + sync(); + stop = get_time(); + mf_fo_logi("sync time : %lf sec", stop - start); + } + + _del_msg_cb(MF_MSG_END, NULL, 0, 0, handle); + + __mf_delete_free_handle(handle); + handle = NULL; + } else { + mf_fo_loga("handle is NULL"); + abort(); + } + + mf_fo_logd("The end of del_thread"); + return NULL; +} + +int mf_delete_items(GList *item_list, mf_cancel *cancel, gboolean sync, void *u_data) +{ + struct _mf_del_handle *handle = NULL; + GList *tmp_list = NULL; + int err = 0; + + if (!item_list) { + mf_fo_loge("item_list is NULL"); + return -(MF_FO_ERR_ARGUMENT); + } + + if (!g_thread_supported()) { + g_thread_init(NULL); + } + + handle = malloc(sizeof(struct _mf_del_handle)); + if (!handle) { + mf_fo_loge("Fail to allocate handle"); + return -(MF_FO_ERR_MEM); + } + memset(handle, 0x00, sizeof(struct _mf_del_handle)); + + handle->lock = g_mutex_new(); + if (!handle->lock) { + mf_fo_loge("Fail to allocate mutex"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + handle->cond = g_cond_new(); + if (!handle->cond) { + mf_fo_loge("Fail to allocate cond"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + handle->cancel = cancel; + handle->u_data = u_data; + handle->sync = sync; + pthread_mutex_lock(&gLockMsg); + flagMsg = 1; + pthread_mutex_unlock(&gLockMsg); + + tmp_list = item_list; + while (tmp_list) { + if (tmp_list->data) { + char *src_item = NULL; + src_item = strdup((char *)tmp_list->data); + if (src_item) { + if (_mf_fo_check_exist(src_item)) { + handle->src_items = g_list_append(handle->src_items, src_item); + } else { + mf_fo_loge("src_item[%s] is not existed", src_item); + err = MF_FO_ERR_ARGUMENT; + free(src_item); + src_item = NULL; + } + } else { + mf_fo_loge("Fail to allocate memory"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + } + tmp_list = g_list_next(tmp_list); + } + + if (!handle->src_items) { + mf_fo_loge("Fail to create src list"); + err = MF_FO_ERR_ARGUMENT; + goto ERROR_FREE_MEM; + } + + handle->pipe = ecore_pipe_add(mf_callback_thread_pipe_cb, u_data); + + if (!g_thread_create((GThreadFunc) delete_thread, handle, FALSE, NULL)) { + mf_fo_loge("Fail to create delete thread"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + return 0; + +ERROR_FREE_MEM: + __mf_delete_free_handle(handle); + return -(err); +} diff --git a/src/common/file-operation/mf-fo-internal.c b/src/common/file-operation/mf-fo-internal.c new file mode 100644 index 0000000..2831116 --- /dev/null +++ b/src/common/file-operation/mf-fo-internal.c @@ -0,0 +1,515 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include /*__NR_gettid*/ +#include +#include + +#include "mf-fo-internal.h" +#include "mf-fo-common.h" +#include "mf-fo-debug.h" + +GSList *dir_list = NULL; +#ifndef SAFE_FREE +#define SAFE_FREE(x) do { \ + if ((x) != NULL) {\ + free(x); \ + x = NULL;\ + } \ + } while (0) +#endif + +#ifndef NAME_MAX +#define NAME_MAX 255 +#endif + +#ifndef FILENAME_MAX +#define FILENAME_MAX 4096 +#endif + +static inline long __mf_fo_get_name_max(void) +{ + long max = 0; + +#ifdef _PC_NAME_MAX + max = pathconf("/", _PC_NAME_MAX); +#endif + + if (max < 1) { + max = NAME_MAX + 1; + } + + return max; +} + +static inline long __mf_fo_get_path_max(void) +{ + long max = 0; + +#ifdef _PC_PATH_MAX + max = pathconf("/", _PC_PATH_MAX); +#endif + + if (max < 1) { + max = FILENAME_MAX; + } + + return max; +} + +static const char *__mf_fo_get_base_name(const char *path) +{ + const char *base = NULL; + + + if (path && (path[0] != '\0')) { + char *tmp = NULL; + tmp = strrchr(path, '/'); + if (tmp[1] == '\0') { + if (tmp == path) { + mf_fo_loge("path is ROOT - %s", path); + } else { + mf_fo_loge("invaild arg - %s", path); + } + } else { + base = tmp + 1; + } + } + return base; +} + +static int __get_directory_hierarchies( const char *pathname, const struct stat *statptr, int type) +{ + mf_fo_dir_list_info *info = NULL; + mf_debug("pathname is [%s]\t type is [%d]\t size is [%ld]", + pathname, type, statptr->st_size); + + switch (type) { + + case FTW_F: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->size = statptr->st_size; + info->type = type; + dir_list = g_slist_append(dir_list, info); + mf_debug("File pathname is [%s]", pathname); + break; + case FTW_D: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->size = statptr->st_size; + info->type = type; + dir_list = g_slist_append(dir_list, info); + mf_debug("Directory pathname is [%s]", pathname); + //process file + break; + default: + mf_debug("Default pathname is [%s]", pathname); + } + + return 0; +} + +static int __mf_fo_get_total_dir_size(const char *dir, unsigned long long *size) +{ + int ret = -1; + if (!dir) { + return -EINVAL; + } + ret = ftw(dir, __get_directory_hierarchies, 16); + if (ret == 0) { + mf_debug(); + mf_fo_dir_list_info *ent = NULL; + GSList *list = NULL; + list = dir_list; + while (list) { + ent = (mf_fo_dir_list_info *)list->data; + if (ent->type == FTW_D) { + *size += MF_VISUAL_FOLDER_SIZE; + } else if (ent->type == FTW_F) { + *size += ent->size; + } + list = g_slist_next(list); + } + } else { + _mf_fo_free_directory_hierarchies(&dir_list); + return -(errno); + } + _mf_fo_free_directory_hierarchies(&dir_list); + + return 0; +} + + +#if 0 +static char *_get_unique_dirname(const char *name) +{ + char *new_name = NULL; + long max = 0; + unsigned int i = 0; + char *num_area = NULL; + gboolean has_num = FALSE; + int next_num = 1; + + if ((num_area = strrchr(name, NEW_NAME_SEPARATOR)) != NULL) { + num_area += 1; + has_num = TRUE; + for (i = (num_area - name); name[i] != '\0'; i++) { + if (!isdigit(name[i])) { + has_num = FALSE; + break; + } + } + } + max = __mf_fo_get_path_max(); + new_name = malloc(sizeof(char) * max); + if (new_name) { + int write_len = 0; + int prefix_len = (int)(num_area - name - 1); + if (has_num) { + next_num = atoi(num_area) + 1; + write_len = snprintf(new_name, max, "%.*s_%d", (int)(num_area - name - 1), name, next_num); + if (write_len > max) { + snprintf(new_name, max, "%.*s_%d", (int)(num_area - name - 1), name, next_num); + } + while (_mf_fo_check_exist(new_name)) { + next_num++; + snprintf(new_name, max, "%.*s_%d", (int)(num_area - name - 1), name, next_num); + } + } else { + snprintf(new_name, max, "%s_%d", name, next_num); + while (_mf_fo_check_exist(new_name)) { + next_num++; + snprintf(new_name, max, "%s_%d", name, next_num); + } + } + } + return new_name; +} +#else +char *_mf_fo_get_next_unique_dirname(const char *name, int *errcode) +{ + char *new_name = NULL; + char *tmp_name = NULL; + int name_len = 0; + long p_max = 0; + + if (!name) { + *errcode = EINVAL; + return NULL; + } + + name_len = strlen(name); + if (name_len <= 1) { + *errcode = EINVAL; + return NULL; + } + + p_max = __mf_fo_get_path_max(); + + if (name[name_len - 1] == '/') { + tmp_name = strndup(name, name_len - 1); + if (!tmp_name) { + *errcode = ENOMEM; + return NULL; + } + } + + new_name = malloc(sizeof(char) * p_max); + + if (new_name) { + int next_num = 0; + long n_max = 0; + + n_max = __mf_fo_get_name_max(); + + do { + int write_len = 0; + next_num++; + write_len = snprintf(new_name, p_max, "%s_%d", tmp_name ? tmp_name : name, next_num); + if (write_len > p_max) { + mf_fo_loge("write_len[%u] is greater than max[%ld]", write_len, p_max); + *errcode = ENAMETOOLONG; + goto ERROR_FREE_RETURN; + } else { + const char *b_name = 0; + b_name = __mf_fo_get_base_name(new_name); + if (b_name && (mf_util_character_count_get(b_name) > n_max)) { + mf_fo_loge("b_name length[%u] is greater than name max[%ld]", strlen(b_name), n_max); + *errcode = ENAMETOOLONG; + goto ERROR_FREE_RETURN; + } + } + } while (_mf_fo_check_exist(new_name)); + } else { + *errcode = ENOMEM; + } + + SAFE_FREE(tmp_name); + return new_name; + +ERROR_FREE_RETURN: + SAFE_FREE(tmp_name); + SAFE_FREE(new_name); + + return NULL; +} +#endif + +char *_mf_fo_get_next_unique_filename(const char *name, int *errcode) +{ + char *new_name = NULL; + int name_len = 0; + long p_max = 0; + const char *base = NULL; + + if (!name) { + *errcode = EINVAL; + return NULL; + } + + name_len = strlen(name); + if (name_len <= 1) { + *errcode = EINVAL; + return NULL; + } + + base = __mf_fo_get_base_name(name); + if (!base) { + *errcode = EINVAL; + return NULL; + } + + p_max = __mf_fo_get_path_max(); + + new_name = malloc(sizeof(char) * p_max); + + if (new_name) { + int next_num = 0; + long n_max = 0; + int dir_len = 0; + int base_len = 0; + const char *ext = NULL; + + n_max = __mf_fo_get_name_max(); + dir_len = (int)(base - name); + + if ((ext = strrchr(name, '.')) != NULL) { + base_len = (int)(ext - base); + } else { + base_len = strlen(base); + } + + do { + int write_len = 0; + next_num++; + if (ext) { + write_len = snprintf(new_name, p_max, "%.*s%.*s_%d%s", dir_len, name, base_len, base, next_num, ext); + } else { + write_len = snprintf(new_name, p_max, "%.*s%.*s_%d", dir_len, name, base_len, base, next_num); + } + + if (write_len > p_max) { + mf_fo_loge("write_len[%u] is greater than max[%ld]", write_len, p_max); + *errcode = ENAMETOOLONG; + goto ERROR_FREE_RETURN; + } else { + const char *b_name = NULL; + b_name = __mf_fo_get_base_name(new_name); + if (b_name && (strlen(b_name) > n_max)) { + mf_fo_loge("b_name length[%u] is greater than name max[%ld]", strlen(b_name), n_max); + *errcode = ENAMETOOLONG; + goto ERROR_FREE_RETURN; + } + } + } while (_mf_fo_check_exist(new_name)); + } else { + *errcode = ENOMEM; + } + + return new_name; + +ERROR_FREE_RETURN: + SAFE_FREE(new_name); + + return NULL; +} + +int _mf_fo_get_total_item_size(const char *item, unsigned long long *size) +{ + struct stat info; + if (!item || !size) { + return -EINVAL; + } + if (stat(item, &info)) { + mf_fo_loge("Fail to stat item : %s", item); + return -(errno); + } + + if (S_ISREG(info.st_mode)) { + *size = (unsigned long long)info.st_size; + } else if (S_ISDIR(info.st_mode)) { + int ret = __mf_fo_get_total_dir_size(item, size); + if (ret < 0) { + mf_fo_loge("Fail to get size of directory(%s)", item); + *size = 0; + return ret; + } + } else { + mf_fo_loge("item(%s) is not file or directory", item); + *size = (unsigned long long)info.st_size; + return -EINVAL; + } + return 0; +} + +int _mf_fo_get_remain_space(const char *path, unsigned long long *size) +{ + FO_TRACE_BEGIN; + struct statfs dst_fs; + + if (!path || !size) { + FO_TRACE_END; + return -EINVAL; + } + + if (statfs(path, &dst_fs) == 0) { + *size = ((unsigned long long)(dst_fs.f_bsize) * (unsigned long long)(dst_fs.f_bavail)); + } else { + FO_TRACE_END; + return -errno; + } + FO_TRACE_END; + + return 0; +} + +inline bool _mf_fo_check_exist(const char *path) +{ + if (path && (access(path, F_OK) == 0)) { + return true; + } + return false; +} + +int _mf_fo_errno_to_mferr(int err_no) +{ + int err = MF_FO_ERR_SET(MF_FO_ERR_UNKNOWN); + switch (err_no) { +#ifdef EINVAL + case EINVAL: + err = MF_FO_ERR_SET(MF_FO_ERR_ARGUMENT); + break; +#endif +#ifdef EACCES /*The requested access to the file is not allowed*/ + case EACCES: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_PERMISSION); + break; +#endif +#ifdef EFAULT /* pathname points outside your accessible address space*/ + case EFAULT: + err = MF_FO_ERR_SET(MF_FO_ERR_FAULT); + break; +#endif +#ifdef EISDIR /*pathname refers to a directory and the access requested involved writing*/ + case EISDIR: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_TYPE); + break; +#endif +#ifdef EMFILE /*The process already has the maximum number of files open.*/ + case EMFILE: + err = MF_FO_ERR_SET(MF_FO_ERR_MAX_OPEN); + break; +#endif +#ifdef ENOSPC /*pathname was to be created but the device containing pathname has no room for the new file*/ + case ENOSPC: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_SPACE); + break; +#endif +#ifdef ENOTDIR /* A component used as a directory in pathname is not*/ + case ENOTDIR: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_TYPE); + break; +#endif +#ifdef EROFS /*pathname refers to a file on a read-only filesystem and write access was requested*/ + case EROFS: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_RO); + break; +#endif +#ifdef ELOOP /* Too many symbolic links were encountered in resolving pathname */ + case ELOOP: + err = MF_FO_ERR_SET(MF_FO_ERR_LOOP); + break; +#endif +#ifdef ENOMEM /* Insufficient kernel memory was available */ + case ENOMEM: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_MEM); + break; +#endif +#ifdef ENOENT /* O_CREAT is not set and the named file does not exist*/ + case ENOENT: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_NOT_EXIST); + break; +#endif +#ifdef ENAMETOOLONG /*pathname was too long.*/ + case ENAMETOOLONG: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_LONG_NAME); + break; +#endif +#ifdef EFBIG /* An attempt was made to write a file that exceeds the implementation-defined maximum + file size or the process file size limit*/ + case EFBIG: /*report*/ + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_BIG_SIZE); + break; +#endif +#ifdef EIO /* I/O error */ + case EIO: + err = MF_FO_ERR_SET(MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_IO); + break; +#endif + default: + break; + } + + return err; +} + +void _mf_fo_free_directory_hierarchies(GSList **glist) +{ + if (*glist == NULL) + return; + GSList *list = *glist; + while (list) { + mf_fo_dir_list_info *info = NULL; + info = (mf_fo_dir_list_info *)list->data; + g_free(info->ftw_path); + g_free(info); + list = g_slist_next(list); + } + g_slist_free(*glist); + *glist = NULL; +} + diff --git a/src/common/file-operation/mf-move-internal.c b/src/common/file-operation/mf-move-internal.c new file mode 100644 index 0000000..ee26ad2 --- /dev/null +++ b/src/common/file-operation/mf-move-internal.c @@ -0,0 +1,800 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-move-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-copy-internal.h" +#include "mf-delete-internal.h" +#include "mf-fo-debug.h" +#include "mf-media-content.h" + +GSList *move_list = NULL; + +#ifndef SAFE_FREE +#define SAFE_FREE(x) do {\ + if ((x) != NULL) {\ + free(x); \ + x = NULL;\ + } \ + } while (0) +#endif + +#define DIR_MODE_BIT (01777) + +static gchar *__mf_move_change_root_name(const char *name, const char *old_root, const char *new_root) +{ + gchar *new_name = NULL; + + if (name && old_root && new_root) { + int old_len = strlen(old_root); + int new_len = strlen(new_root); + int name_len = strlen(name); + const char *base = NULL; + GString *n = NULL; + + if ((strstr(name, old_root) == NULL) + || (name_len <= old_len) + || ((name[old_len] == '/' && name[old_len + 1] == '\0')) + || FALSE) { + mf_fo_loge("invaild args - name : [%s], old_root : [%s]", name, old_root); + return NULL; + } + + base = name + old_len; + if (name[old_len] == '/') { + base += 1; + } + + n = g_string_new(new_root); + if (n) { + if (n->str[new_len - 1] == '/') { + g_string_append_printf(n, "%s", base); + } else { + g_string_append_printf(n, "/%s", base); + } + new_name = g_string_free(n, FALSE); + } + } + return new_name; +} + + +int _mf_move_move_regfile(const char *src, struct stat *src_statp, const char *dst, + unsigned long buf_size, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data) +{ + mode_t src_mode = 0; + dev_t src_dev = 0; + off_t src_size = 0; + struct stat dst_dir_i; + char *dst_dir = NULL; + int err = 0; + char err_buf[MF_ERR_BUF] = {0,}; + + if (!src) { + mf_fo_loge("check argument src"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + if (!dst) { + mf_fo_loge("check argument dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (src_statp) { + src_size = src_statp->st_size; + src_dev = src_statp->st_dev; + src_mode = src_statp->st_mode; + } else { + struct stat src_info; + if (stat(src, &src_info)) { + mf_fo_loge("Fail to stat src file : %s", src); + + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + src_size = src_info.st_size; + src_dev = src_info.st_dev; + src_mode = src_info.st_mode; + } + + if (!S_ISREG(src_mode)) { + mf_fo_loge("src[%s] is not regular file", src); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + + + dst_dir = g_path_get_dirname(dst); + if (dst_dir) { + if (stat(dst_dir, &dst_dir_i)) { + mf_fo_loge("Fail to stat dst dir file : %s", dst_dir); + + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + free(dst_dir); + return err; + } + free(dst_dir); + } else { + mf_fo_loge("fail to get dirname from dst[%s]", dst); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (src_dev == dst_dir_i.st_dev) { + if (rename(src, dst)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to rename item ", dst); + + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + return err; + } else { + mf_fo_logd("success to move file from [%s] to [%s]", src, dst); + if (msg_cb) { + msg_cb(MF_MSG_DOING, src, src_size, 0, msg_data); + } + } + } else { + err = _mf_copy_copy_regfile(src, src_statp, dst, 0, cancel, msg_cb, msg_data); + if (err == 0) { + mf_media_content_scan_file(dst); + } + if (err > 0) { + goto CANCEL_RETURN; + } else if (err < 0) { + goto ERROR_RETURN; + } + + err = _mf_delete_delete_regfile(src, src_statp, cancel, NULL, NULL); + if (err == 0) { + mf_media_content_scan_file(src); + } + if (err > 0) { + goto CANCEL_RETURN; + } else if (err < 0) { + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + goto ERROR_RETURN; + } + mf_fo_logd("[copy/del]success to move file from [%s] to [%s]", src, dst); + } + + return 0; + +ERROR_RETURN: + return err; + + +CANCEL_RETURN: + return 1; +} + +static int __get_move_directory_hierarchies( const char *pathname, const struct stat *statptr, int type) +{ + MF_TRACE_BEGIN; + mf_fo_dir_list_info *info = NULL; + mf_debug("pathname is [%s]\t type is [%d]\t", + pathname, type); + switch (type) { + + case FTW_F: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + move_list = g_slist_append(move_list, info); + mf_debug("File pathname is [%s]", pathname); + break; + case FTW_D: + info = calloc(sizeof(mf_fo_dir_list_info), 1); + info->ftw_path = g_strdup(pathname); + info->type = type; + move_list = g_slist_append(move_list, info); + mf_debug("File pathname is [%s]", pathname); + //process file + break; + default: + mf_debug("Default pathname is [%s]", pathname); + } + + return 0; +} + + +int _mf_move_move_directory(const char *src, struct stat *src_statp, const char *dst, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data) +{ + mode_t src_mode = 0; + dev_t src_dev = 0; + int ret = -1; + int err = 0; + gboolean is_same_dev = FALSE; + char err_buf[MF_ERR_BUF] = {0,}; + + if (!src) { + mf_fo_loge("check argument src"); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + if (!dst) { + mf_fo_loge("check argument dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (src_statp) { + src_dev = src_statp->st_dev; + src_mode = src_statp->st_mode; + } else { + struct stat src_info; + if (stat(src, &src_info)) { + mf_fo_loge("Fail to stat src file : %s", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + src_dev = src_info.st_dev; + src_mode = src_info.st_mode; + } + + if (access(dst, F_OK)) { + if (mkdir(dst, (src_mode & DIR_MODE_BIT))) { + MF_FILE_ERROR_LOG(err_buf, "Fail to make directory ", dst); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + return err; + } + } else { + mf_fo_logi("directory[%s] is already existed", dst); + struct stat dst_info; + if (stat(dst, &dst_info)) { + mf_fo_loge("Fail to stat dst dir : %s", dst); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, dst, 0, err, msg_data); + } + return err; + } + + if (src_dev == dst_info.st_dev) { + mf_fo_logd("src and dst is same dev"); + is_same_dev = TRUE; + } + } + ret = ftw(src, __get_move_directory_hierarchies, 16); + if (ret == 0) { + mf_fo_dir_list_info *ent = NULL; + GSList *list = move_list; + list = move_list; + while (list) { + if (cancel && mf_cancel_check_cancel(cancel)) { + goto DO_CANCEL; + } + ent = (mf_fo_dir_list_info *)list->data; + if (ent->type == FTW_D) { + if (g_strcmp0(ent->ftw_path, src) == 0) { + list = g_slist_next(list); + continue; + } + char *new_dir = __mf_move_change_root_name(ent->ftw_path, src, dst); + mf_fo_logd("move dir %s to %s", ent->ftw_path, new_dir); + if (new_dir) { + if (is_same_dev) { + if (!_mf_fo_check_exist(new_dir)) { + unsigned long long size = 0; + int err_code = 0; + err_code = _mf_fo_get_total_item_size(ent->ftw_path, &size); + if (err_code < 0) { + err = (_mf_fo_errno_to_mferr(err_code) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, ent->ftw_path, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } else { + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } + } else { + mf_fo_logi("directory[%s] is already existed", new_dir); + } + } else { + if (!_mf_fo_check_exist(new_dir)) { + struct stat info; + if (stat(ent->ftw_path, &info) == 0) { + if (mkdir(new_dir, (info.st_mode & DIR_MODE_BIT))) { + mf_fo_loge("Fail to make directory [%s]", new_dir); + /*set FTS_SKIP to skip children of current*/ + /*fts_set(fts, ent, FTS_SKIP);*/ + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } else { + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat ", ent->ftw_path); + /*fts_set(fts, ent, FTS_SKIP);*/ + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, ent->ftw_path, 0, err, msg_data); + } + + free(new_dir); + goto ERROR_CLOSE_FD; + } + } else { + struct stat new_dst_info; + if (stat(new_dir, &new_dst_info) == 0) { + if (S_ISDIR(new_dst_info.st_mode)) { + if (msg_cb) { + msg_cb(MF_MSG_DOING, ent->ftw_path, 0, 0, msg_data); + } + } else { + mf_fo_loge("[%s] is already existed, and this one is not directory", new_dir); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat ", new_dir); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, new_dir, 0, err, msg_data); + } + free(new_dir); + goto ERROR_CLOSE_FD; + } + } + free(new_dir); + } + } else { + + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + } else if (ent->type == FTW_F) { + char *new_file = __mf_move_change_root_name(ent->ftw_path, src, dst); + if (new_file) { + err = _mf_move_move_regfile(ent->ftw_path, NULL, new_file, 0, cancel, msg_cb, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_file); + } + free(new_file); + if (err > 0) { + goto DO_CANCEL; + } else if (err < 0) { + goto ERROR_CLOSE_FD; + } + } else { + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_CLOSE_FD; + } + } + mf_debug("ent->path is [%s]", ent->ftw_path); + list = g_slist_next(list); + } + + } else { + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_cb) { + msg_cb(MF_MSG_ERROR, src, 0, err, msg_data); + } + _mf_fo_free_directory_hierarchies(&move_list); + return err; + } + _mf_fo_free_directory_hierarchies(&move_list); + return 0; + +ERROR_CLOSE_FD: + _mf_fo_free_directory_hierarchies(&move_list); + return err; + +DO_CANCEL: + _mf_fo_free_directory_hierarchies(&move_list); + return 1; +} + +int _mf_move_move_internal(const char *src, const char *dst_dir, + mf_cancel *cancel, mf_req_callback request_callback, _mf_fo_msg_cb msg_callback, void *msg_data) +{ + char *src_basename = NULL; + char *new_dst = NULL; + char *next_name = NULL; + int base_size = 0; + int root_size = 0; + int with_slash = 1; + int alloc_size = 1; /*for null*/ + int err = 0; + struct stat src_info; + struct stat dst_dir_i; + char err_buf[MF_ERR_BUF] = {0,}; + + if (!src || strlen(src) <= 1) { + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (!dst_dir) { + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + if (access(dst_dir, R_OK | W_OK)) { + + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_PERMISSION); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, dst_dir, 0, err, msg_data); + } + return err; + } + + if (stat(src, &src_info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat src", src); + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, src, 0, err, msg_data); + } + return err; + } + + if (stat(dst_dir, &dst_dir_i)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat dst_dir", src); + + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_SRC_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, dst_dir, 0, err, msg_data); + } + return err; + } + + if (S_ISDIR(src_info.st_mode)) { + if (g_strcmp0(dst_dir, src) == 0) { + mf_fo_loge("dst is child of src - src : %s, dst : %s", src, dst_dir); + + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_REPORT_CLASS | MF_FO_ERR_ARGUMENT); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, dst_dir, 0, err, msg_data); + } + return err; + } + } + src_basename = g_path_get_basename(src); + if (!src_basename) { + mf_fo_loge("fail to get basename from src[%s]", src); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + return err; + } + + base_size = strlen(src_basename); + root_size = strlen(dst_dir); + + if (dst_dir[root_size - 1] != '/') { + alloc_size += 1; + with_slash = 0; + } + + alloc_size += (base_size + root_size); + + new_dst = malloc(sizeof(char) * (alloc_size)); + if (!new_dst) { + mf_fo_loge("fail to alloc new dst"); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + + if (with_slash) { + snprintf(new_dst, alloc_size, "%s%s", dst_dir, src_basename); + } else { + snprintf(new_dst, alloc_size, "%s/%s", dst_dir, src_basename); + } + SAFE_FREE(src_basename); + + if (cancel && mf_cancel_check_cancel(cancel)) { + goto CANCEL_FREE_MEM; + } + + if (access(new_dst, F_OK)) { + + if (src_info.st_dev == dst_dir_i.st_dev) { + unsigned long long size = 0; + int ret = _mf_fo_get_total_item_size(src, &size); + if (ret < 0) { + MF_FILE_ERROR_LOG(err_buf, "Fail to get item size", new_dst); + + err = (_mf_fo_errno_to_mferr(-ret) | MF_FO_ERR_SRC_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, src, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } else { + if (rename(src, new_dst)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to rename item", new_dst); + + err = (_mf_fo_errno_to_mferr(errno) | MF_FO_ERR_DST_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, new_dst, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } else { + if (err == 0) { + mf_media_content_scan_file(new_dst); + } + if (msg_callback) { + msg_callback(MF_MSG_DOING, src, size, 0, msg_data); + } + } + } + } else { + if (S_ISDIR(src_info.st_mode)) { + err = _mf_move_move_directory(src, &src_info, new_dst, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_folder(new_dst); + } + } else if (S_ISREG(src_info.st_mode)) { + err = _mf_move_move_regfile(src, &src_info, new_dst, 0, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_dst); + } + } else { + mf_fo_loge("item[%s] is not file or directory", src); + err = MF_FO_ERR_SET(MF_FO_ERR_SRC_CLASS | MF_FO_ERR_TYPE | MF_FO_ERR_REPORT_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, src, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + } + } else { + mf_request_type result = MF_REQ_NONE; + if (request_callback) { + mf_fo_request *req = mf_request_new(); + if (req) { + mf_request_set_path(req, new_dst); + mf_fo_logi("~~~~~~ waiting for request"); + request_callback(req, msg_data); + result = mf_request_get_result(req); + mf_fo_logi("~~~~~~ get request : %d", result); + + if (result == MF_REQ_RENAME) { + next_name = mf_request_get_new_name(req); + } + mf_request_free(req); + } else { + mf_fo_loge("Fail to alloc request"); + err = MF_FO_ERR_SET(MF_FO_ERR_COMMON_CLASS | MF_FO_ERR_MEM); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + } + + switch (result) { + case MF_REQ_NONE: + case MF_REQ_MERGE: + { + struct stat dst_info; + if (stat(new_dst, &dst_info)) { + MF_FILE_ERROR_LOG(err_buf, "Fail to stat new_dst", new_dst); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, errno, msg_data); + } + goto ERROR_FREE_MEM; + } + + if (S_ISDIR(src_info.st_mode)) { + if (!S_ISDIR(dst_info.st_mode)) { + mf_fo_loge("src[%s] is directory, but dst[%s] is already existed and not a directory", src, new_dst); + + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_TYPE); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, new_dst, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_move_move_directory(src, &src_info, new_dst, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_folder(new_dst); + } + } else if (S_ISREG(src_info.st_mode)) { + if (!S_ISREG(dst_info.st_mode)) { + mf_fo_loge("src[%s] is file, but dst[%s] is already existed and not a file", src, new_dst); + err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_TYPE); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, new_dst, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_move_move_regfile(src, &src_info, new_dst, dst_info.st_blksize, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_file(new_dst); + } + } + + } + break; + case MF_REQ_RENAME: + { + if (next_name) { + if (S_ISDIR(src_info.st_mode)) { + err = _mf_move_move_directory(src, &src_info, next_name, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_folder(next_name); + } + } else if (S_ISREG(src_info.st_mode)) { + err = _mf_move_move_regfile(src, &src_info, next_name, 0, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_file(next_name); + } + } + SAFE_FREE(next_name); + } else { + if (S_ISDIR(src_info.st_mode)) { + int errcode = 0; + next_name = _mf_fo_get_next_unique_dirname(new_dst, &errcode); + if (!next_name) { + mf_fo_loge("Fail to get next directory name [%s]", new_dst); + err = (_mf_fo_errno_to_mferr(errcode) | MF_FO_ERR_DST_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_move_move_directory(src, &src_info, next_name, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_folder(next_name); + } + } else if (S_ISREG(src_info.st_mode)) { + int errcode = 0; + next_name = _mf_fo_get_next_unique_filename(new_dst, &errcode); + if (!next_name) { + mf_fo_loge("Fail to get next file name [%s]", new_dst); + err = (_mf_fo_errno_to_mferr(errcode) | MF_FO_ERR_DST_CLASS); + if (msg_callback) { + msg_callback(MF_MSG_ERROR, NULL, 0, err, msg_data); + } + goto ERROR_FREE_MEM; + } + err = _mf_move_move_regfile(src, &src_info, next_name, 0, cancel, msg_callback, msg_data); + if (err == 0) { + mf_media_content_scan_file(next_name); + } + } + SAFE_FREE(next_name); + } + } + break; + case MF_REQ_SKIP: + { + if (msg_callback) { + unsigned long long size = 0; + _mf_fo_get_total_item_size(src, &size); + msg_callback(MF_MSG_SKIP, NULL, size, 0, msg_data); + } + } + break; + case MF_REQ_CANCEL: + { + if (cancel) { + mf_cancel_do_cancel(cancel); + } + goto CANCEL_FREE_MEM; + } + break; + default: + abort(); + break; + + } + } + SAFE_FREE(new_dst); + + if (err > 0) { + goto CANCEL_FREE_MEM; + } else if (err < 0) { + goto ERROR_FREE_MEM; + } + + return 0; + +ERROR_FREE_MEM: + SAFE_FREE(src_basename); + SAFE_FREE(new_dst); + + return err; + +CANCEL_FREE_MEM: + + mf_fo_logi("move cancelled"); + SAFE_FREE(new_dst); + + return 1; +} diff --git a/src/common/file-operation/mf-move.c b/src/common/file-operation/mf-move.c new file mode 100644 index 0000000..111ce74 --- /dev/null +++ b/src/common/file-operation/mf-move.c @@ -0,0 +1,488 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-move.h" +#include "mf-move-internal.h" +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" +#include "mf-fo-debug.h" +#include "mf-callback.h" + +extern int flagMsg; +extern pthread_mutex_t gLockMsg; +extern pthread_cond_t gCondMsg; + +struct _mf_move_handle { + GList *src_items; + char *dst_dir; + mf_cancel *cancel; + void *u_data; + gboolean sync; + + GMutex *lock; + GCond *cond; + + mf_fo_msg msg; + mf_fo_request *req; + Ecore_Pipe *pipe; +}; + +static double __mf_move_get_time(void) +{ + struct timeval timev; + + gettimeofday(&timev, NULL); + return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); +} + +static void __mf_move_free_handle(struct _mf_move_handle *handle) +{ + if (handle) { + if (handle->lock) { + g_mutex_free(handle->lock); + } + if (handle->cond) { + g_cond_free(handle->cond); + } + if (handle->dst_dir) { + free(handle->dst_dir); + } + if (handle->src_items) { + g_list_foreach(handle->src_items, (GFunc) free, NULL); + g_list_free(handle->src_items); + } + if (handle->msg.current_real) { + g_free(handle->msg.current_real); + handle->msg.current_real = NULL; + } + free(handle); + } + + return; +} + +static gboolean __mf_move_msg_publish(gpointer data) +{ + struct _mf_move_handle *handle = NULL; + handle = (struct _mf_move_handle *)data; + mf_fo_msg msg; + + if (!handle) { + goto EXIT; + } + MYFILE_MAGIC_SET(&msg, MYFILE_MAGIC_PIPE_DATA); + + g_mutex_lock(handle->lock); + msg.msg_type = handle->msg.msg_type; + msg.error_code = handle->msg.error_code; + msg.current = handle->msg.current; + msg.current_index = handle->msg.current_index; + msg.total_index = handle->msg.total_index; + msg.current_size = handle->msg.current_size; + msg.total_size = handle->msg.total_size; + msg.current_real = handle->msg.current_real; + msg.request = NULL; + msg.pipe = handle->pipe; + g_mutex_unlock(handle->lock); + + ecore_pipe_write(handle->pipe, &msg, sizeof(msg)); + +EXIT: + return FALSE; +} + +static void __mf_move_msg_cb(mf_msg_type msg_type, const char *real, unsigned long long size, int error_code, void *data) +{ + struct _mf_move_handle *handle = NULL; + handle = (struct _mf_move_handle *)data; + + pthread_mutex_lock(&gLockMsg); + while (flagMsg == 0) { + mf_fo_loge("!!!!!!!!!!!! wait"); + pthread_cond_wait(&gCondMsg, &gLockMsg); + } + flagMsg = 0; + pthread_mutex_unlock(&gLockMsg); + + if (handle) { + g_mutex_lock(handle->lock); + handle->msg.msg_type = msg_type; + if (msg_type == MF_MSG_ERROR) { + handle->msg.error_code = error_code; + if (real) { + if (handle->msg.current_real) { + free(handle->msg.current_real); + } + handle->msg.current_real = strdup(real); + } + } else { + handle->msg.error_code = 0; + if (msg_type == MF_MSG_DOING) { + if (real) { + if (handle->msg.current_real) { + free(handle->msg.current_real); + } + handle->msg.current_real = strdup(real); + } + handle->msg.current_size += size; + handle->msg.error_code = 0; + } else if (msg_type == MF_MSG_SKIP) { + handle->msg.total_size -= size; + handle->msg.error_code = 0; + } + } + g_mutex_unlock(handle->lock); + __mf_move_msg_publish(handle); + } + return; +} + +static gboolean __mf_move_req_msg_callback(gpointer data) +{ + FO_TRACE_BEGIN; + + struct _mf_move_handle *mv_handle = NULL; + mv_handle = (struct _mf_move_handle *)data; + mf_fo_msg msg; + memset(&msg, 0, sizeof(mf_fo_msg)); + + MYFILE_MAGIC_SET(&msg, MYFILE_MAGIC_PIPE_DATA); + if (!mv_handle) { + goto EXIT; + } + + g_mutex_lock(mv_handle->lock); + msg.msg_type = MF_MSG_REQUEST; + msg.error_code = mv_handle->msg.error_code; + msg.current = mv_handle->msg.current; + msg.current_index = mv_handle->msg.current_index; + msg.total_index = mv_handle->msg.total_index; + msg.current_size = mv_handle->msg.current_size; + msg.total_size = mv_handle->msg.total_size; + msg.current_real = mv_handle->msg.current_real; + msg.request = mv_handle->req; + g_mutex_unlock(mv_handle->lock); + ecore_pipe_write(mv_handle->pipe, &msg, sizeof(msg)); + +EXIT: + + FO_TRACE_END; + return FALSE; +} + +static void __mf_move_req_cb(mf_fo_request *req, void *data) +{ + struct _mf_move_handle *handle = NULL; + handle = (struct _mf_move_handle *)data; + + if (handle) { + + handle->req = req; + mf_request_set_cond(req, handle->cond); + __mf_move_req_msg_callback(handle); + g_mutex_lock(handle->lock); + while (mf_request_flag_get(req)) { + g_cond_wait(handle->cond, handle->lock); + } + mf_request_flag_set(req, 1); + g_mutex_unlock(handle->lock); + } + return; +} + +static void *__mf_move_thread_func(void *data) +{ + struct _mf_move_handle *handle = NULL; + handle = (struct _mf_move_handle *)data; + + gboolean cancelled = FALSE; + double s_start = 0.0; + double s_stop = 0.0; + double c_start = 0.0; + double c_stop = 0.0; + char err_buf[MF_ERR_BUF] = {0,}; + + if (handle) { + GList *tmp_src_list = NULL; + unsigned long long t_size = 0; + unsigned long long r_size = 0; + unsigned long long n_size = 0; + int errcode = 0; + struct stat dst_info; + + errcode = _mf_fo_get_remain_space(handle->dst_dir, &r_size); + if (errcode < 0) { + + __mf_move_msg_cb(MF_MSG_ERROR, handle->dst_dir, 0, (MF_FO_ERR_DST_CLASS | _mf_fo_errno_to_mferr(-errcode)), handle); + + goto ERROR_END_THREAD; + } + + if (r_size == 0) { + + int err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_SPACE); + __mf_move_msg_cb(MF_MSG_ERROR, handle->dst_dir, 0, err, handle); + + goto ERROR_END_THREAD; + } + + n_size = r_size; + + if (stat(handle->dst_dir, &dst_info)) { + + __mf_move_msg_cb(MF_MSG_ERROR, handle->dst_dir, 0, (MF_FO_ERR_DST_CLASS | _mf_fo_errno_to_mferr(errno)), handle); + + goto ERROR_END_THREAD; + } + + s_start = __mf_move_get_time(); + tmp_src_list = handle->src_items; + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + unsigned long long size = 0; + + s_path = tmp_src_list->data; + if (access(s_path, R_OK) == 0) { + errcode = _mf_fo_get_total_item_size(s_path, &size); + if (errcode < 0) { + mf_fo_loge("Fail to get size of %s", s_path); + + __mf_move_msg_cb(MF_MSG_ERROR, s_path, 0, + (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(-errcode)), handle); + + + goto ERROR_END_THREAD; + } else { + struct stat src_info; + mf_fo_logi("size of %s - %lld", s_path, size); + t_size += size; + + if (stat(s_path, &src_info)) { + + __mf_move_msg_cb(MF_MSG_ERROR, handle->dst_dir, 0, + (MF_FO_ERR_DST_CLASS | _mf_fo_errno_to_mferr(errno)), handle); + + goto ERROR_END_THREAD; + } + + if (dst_info.st_dev != src_info.st_dev) { + if (n_size > size) { + n_size -= size; + } else { + mf_fo_loge("remain size [%lld], needed size [%lld], current item size [%lld] -[%s]", + r_size, n_size, size, s_path); + + + int err = MF_FO_ERR_SET(MF_FO_ERR_DST_CLASS | MF_FO_ERR_SPACE); + __mf_move_msg_cb(MF_MSG_ERROR, handle->dst_dir, 0, err, handle); + + goto ERROR_END_THREAD; + } + } + } + } else { + MF_FILE_ERROR_LOG(err_buf, "Unable to access", s_path); + + __mf_move_msg_cb(MF_MSG_ERROR, s_path, 0, (MF_FO_ERR_SRC_CLASS | _mf_fo_errno_to_mferr(errno)), handle); + + goto ERROR_END_THREAD; + } + } + tmp_src_list = g_list_next(tmp_src_list); + } + s_stop = __mf_move_get_time(); + g_mutex_lock(handle->lock); + handle->msg.total_size = t_size; + g_mutex_unlock(handle->lock); + + mf_fo_logi("total size [%lld], remain size [%lld] -[%s]", t_size, r_size, handle->dst_dir); + + c_start = __mf_move_get_time(); + tmp_src_list = handle->src_items; + while (tmp_src_list) { + if (tmp_src_list->data) { + const char *s_path = NULL; + s_path = tmp_src_list->data; + int ret = 0; + g_mutex_lock(handle->lock); + handle->msg.current_index++; + handle->msg.current = s_path; + g_mutex_unlock(handle->lock); + ret = _mf_move_move_internal(s_path, handle->dst_dir, handle->cancel, __mf_move_req_cb, __mf_move_msg_cb, handle); + + if (ret > 0) { + if (handle->cancel) { + mf_cancel_set_cancelled(handle->cancel); + } + cancelled = TRUE; + break; + } + if (ret < 0) { + mf_fo_loge("Fail to move [%s] to [%s]", s_path, handle->dst_dir); + break; + } + } + tmp_src_list = g_list_next(tmp_src_list); + + } + c_stop = __mf_move_get_time(); + mf_fo_logi("## Total src size - %lld byte, size time : %lf sec, move time : %lf sec", + handle->msg.total_size, s_stop - s_start, c_stop - c_start); + + if (cancelled) { + __mf_move_msg_cb(MF_MSG_CANCELLED, NULL, 0, 0, handle); + } + +ERROR_END_THREAD: + + if (handle->sync) { + double start = 0.0; + double stop = 0.0; + __mf_move_msg_cb(MF_MSG_SYNC, NULL, 0, 0, handle); + start = __mf_move_get_time(); + sync(); + stop = __mf_move_get_time(); + mf_fo_logi("sync time : %lf sec", stop - start); + } + + __mf_move_msg_cb(MF_MSG_END, NULL, 0, 0, handle); + + __mf_move_free_handle(handle); + handle = NULL; + } else { + mf_fo_loge("handle is NULL"); + abort(); + } + + mf_fo_logd("The end of __mf_move_thread_func"); + return NULL; +} + + +int mf_move_move_items(GList *item_list, const char *dst_dir, mf_cancel *cancel, gboolean sync, void *u_data) +{ + struct _mf_move_handle *handle = NULL; + GList *tmp_list = NULL; + int err = 0; + + if (!item_list) { + mf_fo_loge("item_list is NULL"); + return -(MF_FO_ERR_ARGUMENT); + } + if (!dst_dir) { + mf_fo_loge("dst_dir is NULL"); + return -(MF_FO_ERR_ARGUMENT); + } + + if (!_mf_fo_check_exist(dst_dir)) { + mf_fo_loge("dst_dir[%s] is not existed", dst_dir); + return -(MF_FO_ERR_ARGUMENT); + } + + if (!g_thread_supported()) { + g_thread_init(NULL); + } + + handle = malloc(sizeof(struct _mf_move_handle)); + if (!handle) { + mf_fo_loge("Fail to allocate handle"); + return -(MF_FO_ERR_MEM); + } + memset(handle, 0x00, sizeof(struct _mf_move_handle)); + + handle->lock = g_mutex_new(); + if (!handle->lock) { + mf_fo_loge("Fail to allocate mutex"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + handle->cond = g_cond_new(); + if (!handle->cond) { + mf_fo_loge("Fail to allocate cond"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + handle->dst_dir = strdup(dst_dir); + if (!handle->dst_dir) { + mf_fo_loge("Fail to allocate memory"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + handle->cancel = cancel; + handle->u_data = u_data; + handle->sync = sync; + + pthread_mutex_lock(&gLockMsg); + flagMsg = 1; + pthread_mutex_unlock(&gLockMsg); + + tmp_list = item_list; + while (tmp_list) { + if (tmp_list->data) { + char *src_item = NULL; + src_item = strdup((char *)tmp_list->data); + if (src_item) { + if (_mf_fo_check_exist(src_item)) { + handle->src_items = g_list_append(handle->src_items, src_item); + } else { + mf_fo_loge("src_item[%s] is not existed", src_item); + err = MF_FO_ERR_ARGUMENT; + free(src_item); + src_item = NULL; + } + } else { + mf_fo_loge("Fail to allocate memory"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + } + tmp_list = g_list_next(tmp_list); + } + + if (!handle->src_items) { + mf_fo_loge("Fail to create src list"); + err = MF_FO_ERR_ARGUMENT; + goto ERROR_FREE_MEM; + } + + handle->pipe = ecore_pipe_add(mf_callback_thread_pipe_cb, u_data); + if (!g_thread_create((GThreadFunc) __mf_move_thread_func, handle, FALSE, NULL)) { + mf_fo_loge("Fail to create move thread"); + err = MF_FO_ERR_MEM; + goto ERROR_FREE_MEM; + } + + return 0; + +ERROR_FREE_MEM: + __mf_move_free_handle(handle); + return -(err); +} diff --git a/src/common/file-operation/mf-request.c b/src/common/file-operation/mf-request.c new file mode 100644 index 0000000..8c4c858 --- /dev/null +++ b/src/common/file-operation/mf-request.c @@ -0,0 +1,164 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include "mf-request.h" + +int flagMsg = 1; +pthread_mutex_t gLockMsg; +pthread_cond_t gCondMsg; + +struct _mf_fo_req { + GCond *cond; + GMutex *lock; + const char *path; + char *new_name; + int flagCond; + mf_request_type request; +}; + +mf_fo_request *mf_request_new(void) +{ + mf_fo_request *result = NULL; + + result = malloc(sizeof(mf_fo_request)); + if (result) { + result->cond = NULL; + result->path = NULL; + result->new_name = NULL; + result->flagCond = 1; + result->request = MF_REQ_MERGE; + } + return result; +} + +void mf_request_free(mf_fo_request *req) +{ + if (req) { + if (req->new_name) { + free(req->new_name); + } + free(req); + } + return; +} + +void mf_request_set_result(mf_fo_request *req, mf_request_type result) +{ + if (req) { + req->request = result; + + if (req->cond) { + if (req->flagCond == 1) { + req->flagCond = 0; + g_cond_broadcast(req->cond); + } + } + } + + return; +} + +void mf_request_set_result_rename(mf_fo_request *req, const char *new_name) +{ + if (req) { + req->request = MF_REQ_RENAME; + if (new_name) { + req->new_name = strdup(new_name); + } + + if (req->cond) { + g_cond_broadcast(req->cond); + } + } + + return; +} + +void mf_request_set_cond(mf_fo_request *req, GCond * cond) +{ + if (req) { + req->cond = cond; + } + return; +} + +void mf_request_set_path(mf_fo_request *req, const char *path) +{ + if (req) { + req->path = path; + } + return; +} + +char *mf_request_get_new_name(mf_fo_request *req) +{ + char *new_name = NULL; + if (req) { + new_name = req->new_name; + req->new_name = NULL; + } + return new_name; +} + +const char *mf_request_get_path(mf_fo_request *req) +{ + if (req) { + return req->path; + } + return NULL; +} + +mf_request_type mf_request_get_result(mf_fo_request *req) +{ + mf_request_type request = MF_REQ_NONE; + if (req) { + request = req->request; + } + return request; +} + + +void mf_msg_request_handled_send() +{ + pthread_mutex_lock(&gLockMsg); + if (flagMsg == 0) { + flagMsg = 1; + pthread_cond_signal(&gCondMsg); + } + pthread_mutex_unlock(&gLockMsg); +} + +int mf_request_flag_get(mf_fo_request *req) +{ + if (req) { + return req->flagCond; + } + return -1; +} + +void mf_request_flag_set(mf_fo_request *req, int value) +{ + if (req) { + req->flagCond = value; + } +} diff --git a/src/common/file-operation/mf-search-internal.c b/src/common/file-operation/mf-search-internal.c new file mode 100644 index 0000000..8a47352 --- /dev/null +++ b/src/common/file-operation/mf-search-internal.c @@ -0,0 +1,848 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include + +#include "mf-main.h" +#include "mf-search.h" +#include "mf-search-internal.h" +#include "mf-fs-util.h" + +#define APPEND_SIZE 2 /* for null and slash */ + +#define NORMALIZE_OPTION G_NORMALIZE_NFD + +#ifdef CHECK_RESTRICTED_PATH +/* TODO + * This code should be revised. + * How to get restricted path information? + * I think this module should not depend on other lib(except glib and stdlib). +*/ +#define ROOT_UMS "/opt/usr/media" +#define ROOT_MMC "/opt/storage/sdcard" +#endif /* CHECK_RESTRICTED_PATH */ + +int flagSearchMsg = 1; +pthread_mutex_t gLockSearchMsg; +pthread_cond_t gCondSearchMsg; + +static void __mf_search_tx_wait(); +static void __mf_search_result_publish_msg(mf_search_pipe_msg_type type, void *result, void *user_data); + +inline static void __mf_search_cmd_lock(ms_handle_t *handle) +{ + if (handle && handle->cmd_lock) { + g_mutex_lock(handle->cmd_lock); + } + return; +} + +inline static void __mf_search_cmd_unlock(ms_handle_t *handle) +{ + if (handle && handle->cmd_lock) { + g_mutex_unlock(handle->cmd_lock); + } + return; +} + +inline static void __mf_search_thread_lock(ms_handle_t *handle) +{ + if (handle && handle->thread_mutex) { + g_mutex_lock(handle->thread_mutex); + } + return; +} + +inline static void __mf_search_thread_unlock(ms_handle_t *handle) +{ + if (handle && handle->thread_mutex) { + g_mutex_unlock(handle->thread_mutex); + } + return; +} + +inline static void __mf_search_args_free(ms_args_t *args) +{ + if (args) { + if (args->root_path) { + g_list_foreach(args->root_path, (GFunc) g_free, NULL); + g_list_free(args->root_path); + args->root_path = NULL; + } + + if (args->needle) + g_free(args->needle); + + g_free(args); + } + return; +} + +inline static void __mf_search_result_free(mf_search_result_t *result) +{ + if (result) { + if (result->current_dir) { + g_free(result->current_dir); + result->current_dir = NULL; + } + if (result->dir_list) { + g_list_foreach(result->dir_list, (GFunc) g_free, NULL); + g_list_free(result->dir_list); + result->dir_list = NULL; + } + if (result->file_list) { + g_list_foreach(result->file_list, (GFunc) g_free, NULL); + g_list_free(result->file_list); + result->file_list = NULL; + } + g_free(result); + } + return; +} + +#ifdef CHECK_RESTRICTED_PATH +gboolean __mf_search_check_licet_path(const char *path) +{ + return (gboolean) (strstr(path, ROOT_UMS) || strstr(path, ROOT_MMC)); +} +#endif /*CHECK_RESTRICTED_PATH*/ + + + /*This function is for testing and should be revised for performance before applying*/ +static inline gboolean __has_nonspacing_mark(const char *nstr) +{ + if (nstr) { + const char *p_str = nstr; + while (p_str && *p_str) { + gunichar uc; + uc = g_utf8_get_char(p_str); + if (g_unichar_type(uc) == G_UNICODE_NON_SPACING_MARK) { + return TRUE; + } else { + p_str = g_utf8_next_char(p_str); + } + } + } + return FALSE; +} + +static gboolean __mf_search_NFD_strstr(const char *str, const char *needle) +{ + int s_len = 0; + int n_len = 0; + + if (!str) { + return FALSE; + } + s_len = strlen(str); + + if (!needle) { + return FALSE; + } else { + n_len = strlen(needle); + if (n_len == 0) { + return FALSE; + } + } + + if (s_len < n_len) + return FALSE; + + if (__has_nonspacing_mark(str)) { + const char *p_str = str; + const char *end = p_str + s_len - n_len; + + while (p_str && p_str <= end && *p_str) { + const char *s = p_str; + const char *n = needle; + while (n && *n) { + if (s && *s) { + gunichar sc, nc; + sc = g_utf8_get_char(s); + nc = g_utf8_get_char(n); + if (g_unichar_type(sc) == G_UNICODE_NON_SPACING_MARK) { + if (g_unichar_type(nc) == G_UNICODE_NON_SPACING_MARK) { + if (sc != nc) { + goto next; + } else { + s = g_utf8_next_char(s); + n = g_utf8_next_char(n); + } + } else { + s = g_utf8_next_char(s); + } + } else if (sc != nc) { + goto next; + } else { + s = g_utf8_next_char(s); + n = g_utf8_next_char(n); + } + } else { + return FALSE; + } + } + + return TRUE; +next: + p_str = g_utf8_next_char(p_str); + } + } else { + return (gboolean) (!(!strstr(str, needle))); + } + return FALSE; +} + +static GList *__mf_search_do_find(const char *root, + const char *needle, + mf_search_option option, + ms_handle_t *handle) +{ + DIR *directory = NULL; + GList *candidate = NULL; + + char *up_needle = NULL; + char *up_name = NULL; + char err_buf[MF_ERR_BUF] = {0,}; + + if (!handle) { + ms_error("handle is NULL"); + return NULL; + } + + if (!handle->result) { + ms_error("handle->result is NULL"); + return NULL; + } + + if (!root) { + ms_error("invaild args"); + return NULL; + } + + if (!needle && !handle->args->func) { + return NULL; + } + + if (!g_file_test(root, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { + ms_error("invaild root_path : %s", root); + return NULL; + } + + directory = opendir(root); + if (directory) { + mf_search_result_t *result = NULL; + struct dirent *entry = NULL; + + result = handle->result; + __mf_search_thread_lock(handle); + if (result->current_dir) { + g_free(result->current_dir); + } + result->current_dir = g_strdup(root); + __mf_search_thread_unlock(handle); + while ((entry = readdir(directory)) != NULL) { + if (!(option & MF_SEARCH_OPT_HIDDEN) && (0 == strncmp(entry->d_name, ".", 1))) { + ms_debug("[%s] is hidden file. Skip it", entry->d_name); + continue; + } + + if (handle->is_stop == TRUE) { + mf_debug("break from do find"); + break; + } + + if (entry->d_type & DT_REG) { + if (option & MF_SEARCH_OPT_FILE) { + __mf_search_thread_lock(handle); + result->total_count++; + __mf_search_thread_unlock(handle); + + up_name = g_utf8_strup(entry->d_name, strlen(entry->d_name)); + gchar *nor_str = g_utf8_normalize(up_name, -1, NORMALIZE_OPTION); + if (handle->args->func) { + gchar *path = NULL; + gssize len = strlen(root) + strlen(entry->d_name) + APPEND_SIZE; /* for null and slash*/ + path = g_malloc(sizeof(gchar) * len); + if (path) { + g_snprintf(path, len, "%s/%s", root, entry->d_name); + int category = handle->args->func(nor_str); + if (category == handle->args->category) { + g_snprintf(path, len, "%s/%s", root, entry->d_name); + + __mf_search_thread_lock(handle); + result->file_list = g_list_append(result->file_list, (gpointer) path); + result->is_end = FALSE; + __mf_search_thread_unlock(handle); + + __mf_search_tx_wait(); + __mf_search_result_publish_msg(MF_SEARCH_PIPE_MSG_RESULT_REPORT, result, + handle->args->user_data); + } + /*1 TODO: how can i handle else case?*/ + } + } else if (needle){ + up_needle = g_utf8_strup(needle, strlen(needle)); + /* should we check the return value for further use? */ + if (__mf_search_NFD_strstr(nor_str, up_needle)) + { + gchar *path = NULL; + gssize len = strlen(root) + strlen(entry->d_name) + APPEND_SIZE; /* for null and slash*/ + path = g_malloc(sizeof(gchar) * len); + if (path) { + g_snprintf(path, len, "%s/%s", root, entry->d_name); + + __mf_search_thread_lock(handle); + result->file_list = g_list_append(result->file_list, (gpointer) path); + result->is_end = FALSE; + __mf_search_thread_unlock(handle); + + __mf_search_tx_wait(); + __mf_search_result_publish_msg(MF_SEARCH_PIPE_MSG_RESULT_REPORT, result, + handle->args->user_data); + } + /*1 TODO: how can i handle else case?*/ + } + } + + /*Todo:*/ + g_free(nor_str); + free(up_needle); + up_needle = NULL; + free(up_name); + up_name = NULL; + } + } else if (entry->d_type & DT_DIR) { + gchar *path = NULL; + gssize len = 0; + + len = strlen(entry->d_name); + /*skip current and upper directory*/ + if (0 == strncmp(entry->d_name, ".", strlen(".")) || 0 == strncmp(entry->d_name, "..", strlen(".."))) { + continue; + } + /* we are not going to search /opt/media/SLP_Debug folder */ + if ((strlen(result->current_dir) == strlen(PHONE_FOLDER)) && (strcmp(result->current_dir, PHONE_FOLDER) == 0) + && (strlen(entry->d_name) == strlen(DEBUG_FOLDER)) && (strcmp(entry->d_name, DEBUG_FOLDER) == 0)) { + ms_debug("[%s] is hidden folder. Skip it", entry->d_name); + continue; + } + + len = strlen(root) + strlen(entry->d_name) + APPEND_SIZE; /* for null and slash */ + path = g_malloc(sizeof(gchar) * len); + if (path) { + g_snprintf(path, len, "%s/%s", root, entry->d_name); + candidate = g_list_append(candidate, (gpointer) path); + } + /*1 TODO: how can i handle else case?*/ + if (option & MF_SEARCH_OPT_DIR) { + __mf_search_thread_lock(handle); + result->total_count++; + __mf_search_thread_unlock(handle); + + up_name = g_utf8_strup(entry->d_name, strlen(entry->d_name)); + if (up_name && needle) { + up_needle = g_utf8_strup(needle, strlen(needle)); + gchar *nor_str = g_utf8_normalize(up_name, -1, NORMALIZE_OPTION); + if (__mf_search_NFD_strstr(nor_str, up_needle)) + { + __mf_search_thread_lock(handle); + result->dir_list = g_list_append(result->dir_list, (gpointer) g_strdup(path)); + result->is_end = FALSE; + __mf_search_thread_unlock(handle); + __mf_search_tx_wait(); + __mf_search_result_publish_msg(MF_SEARCH_PIPE_MSG_RESULT_REPORT, result, handle->args->user_data); + } + g_free(nor_str); + free(up_name); + up_name = NULL; + + free(up_needle); + up_needle = NULL; + } + } + } + } + closedir(directory); + directory = NULL; + } else { + MF_FILE_ERROR_LOG(err_buf, "open failed", root); + } + + return candidate; +} + +static gpointer __mf_search_find_thread(gpointer data) +{ + ms_handle_t *handle = (ms_handle_t *) data; + if (handle) { + ms_args_t *args = NULL; + mf_search_result_t *result = NULL; + + result = handle->result; + args = handle->args; + + if (args && result) { + GList *root = NULL; + GList *candidate = NULL; /*use this list as stack*/ + root = args->root_path; + while (root) { + char *path = (char *)root->data; + if (path) { + /*push root paths to stack*/ + candidate = g_list_append(candidate, (gpointer) g_strdup(path)); + } + root = g_list_next(root); + } + + while (candidate) { + GList *new_list = NULL; + GList *list = NULL; + gchar *item = NULL; + + __mf_search_thread_lock(handle); + if (handle->is_stop) { + __mf_search_thread_unlock(handle); + result->is_end = TRUE; + goto MF_FIND_THREAD_EXIT; + } + __mf_search_thread_unlock(handle); + + list = g_list_first(candidate); + /*pop one path from stack*/ + candidate = g_list_remove_link(candidate, list); + item = (gchar *) list->data; + if (item) { + ms_debug("current : %s", item); +#if 0 + __mf_search_thread_lock(handle); + if (result->current_dir) { + g_free(result->current_dir); + } + result->current_dir = g_strdup(item); + __mf_search_thread_unlock(handle); +#endif + /*publish root change message here*/ + __mf_search_tx_wait(); + if (handle->is_stop) { + result->is_end = TRUE; + goto MF_FIND_THREAD_EXIT; + } + __mf_search_result_publish_msg(MF_SEARCH_PIPE_MSG_ROOT_CHANGE, item, args->user_data); + new_list = __mf_search_do_find(item, args->needle, args->option, handle); + g_free(item); + item = NULL; + g_list_free(list); + list = NULL; + } + /*push new paths to stack*/ + candidate = g_list_concat(new_list, candidate); + } + + __mf_search_thread_lock(handle); + result->is_end = TRUE; + __mf_search_thread_unlock(handle); + __mf_search_tx_wait(); + __mf_search_result_publish_msg(MF_SEARCH_PIPE_MSG_FINISHED, handle->result, args->user_data); +MF_FIND_THREAD_EXIT: + if (candidate) { + g_list_foreach(candidate, (GFunc) g_free, NULL); + g_list_free(candidate); + candidate = NULL; + } + } else { + ms_error("args : %p or result : %p is not allocated yet!!", handle->args, handle->result); + } + } + /*g_thread_exit(NULL);*/ + return NULL; +} + +int _mf_search_init(ms_handle_t **handle) +{ + GMutex *lock = NULL; + ms_handle_t *ms_handle = NULL; + + ms_debug(""); + + if (!handle) { + return MF_SEARCH_ERROR_INVAL_P; + } + + ms_handle = g_malloc0(sizeof(ms_handle_t)); + if (ms_handle == NULL) { + ms_error("Fail to allocate memory for handle "); + *handle = NULL; + return MF_SEARCH_ERROR_ALLOC; + } + + ms_handle->state = MF_SEARCH_STATE_INIT; + ms_handle->is_stop = FALSE; + + lock = g_mutex_new(); + if (!lock) { + ms_error("Fail to create cmd_lock"); + g_free(ms_handle); + return MF_SEARCH_ERROR_ALLOC; + } + ms_handle->cmd_lock = lock; + + *handle = ms_handle; + + ms_info("Success to make search handle : %p", ms_handle); + return MF_SEARCH_ERROR_NONE; +} + +int _mf_search_start(ms_handle_t *handle, + const char **root_path, + unsigned int path_num, + const char *needle, + mf_search_option option, + void *user_data, + mf_search_filter_cb func, + int category) +{ + ms_args_t *args = NULL; + mf_search_result_t *result = NULL; + mf_search_option l_opt = MF_SEARCH_OPT_NONE; + int ret = MF_SEARCH_ERROR_NONE; + int i = 0; + + if (!handle) { + ms_error("handle is NULL"); + return MF_SEARCH_ERROR_INVAL_P; + } + + if (handle->state != MF_SEARCH_STATE_INIT) { + ms_error("invaild state : %d", handle->state); + return MF_SEARCH_ERROR_INVAL_S; + } + + if (!root_path || path_num < 1) { + ms_error("invaild arguments - root[%p], path_num[%d], needle[%p]", root_path, path_num, needle); + return MF_SEARCH_ERROR_INVAL_P; + } + if (!needle && !func) { + return MF_SEARCH_ERROR_INVAL_P; + } + + __mf_search_cmd_lock(handle); + + if (handle->args) { + __mf_search_args_free(handle->args); + handle->args = NULL; + } + handle->args = args = g_malloc0(sizeof(ms_args_t)); + if (!args) { + ms_error("fail to alloc args"); + ret = MF_SEARCH_ERROR_ALLOC; + goto FAIL_FREE_MEM; + } + + if (option == MF_SEARCH_OPT_NONE) { + ms_warn("option is MF_SEARCH_OPT_NONE, set all option automatically "); + l_opt = MF_SEARCH_OPT_HIDDEN | MF_SEARCH_OPT_DIR | MF_SEARCH_OPT_FILE; + } else { + l_opt = option; + } + + for (i = 0; i < path_num; i++) { + const char *path = root_path[i]; + mf_debug("%d th root path is %s", i, path); +#ifdef CHECK_RESTRICTED_PATH + if (!__mf_search_check_licet_path(path)) { + ms_error("%dth root path[%s] is invaild", i, path); + ret = MF_SEARCH_ERROR_INVAL_P; + goto FAIL_FREE_MEM; + } +#endif /*CHECK_RESTRICTED_PATH*/ + if (g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) + && ((l_opt & MF_SEARCH_OPT_HIDDEN) || strncmp(path, ".", 1)) + && TRUE) { + gchar *new_path = NULL; + gssize len = strlen(path); + + if (path[len - 1] == '/') { + new_path = g_strndup(path, len - 1); + } else { + new_path = g_strndup(path, len); + } + args->root_path = g_list_append(args->root_path, (gpointer) new_path); + } else { + ms_error("Fail to test %dth root path[%s]", i, path); + ret = MF_SEARCH_ERROR_INVAL_P; + goto FAIL_FREE_MEM; + } + } + args->user_data = user_data; + + if (needle) { + args->needle = g_utf8_normalize(needle, -1, NORMALIZE_OPTION); + if (!args->needle) { + ms_error("fail to alloc args->needle"); + goto FAIL_FREE_MEM; + } + } + args->option = l_opt; + args->func = func; + args->category = category; + if (handle->result) { + __mf_search_result_free(handle->result); + handle->result = NULL; + } + handle->result = result = g_malloc0(sizeof(mf_search_result_t)); + if (!result) { + ms_error("fail to alloc result"); + ret = MF_SEARCH_ERROR_ALLOC; + goto FAIL_FREE_MEM; + } + + handle->thread_mutex = g_mutex_new(); + if (!handle->thread_mutex) { + ms_error("fail to alloc handle->thread_mutex"); + ret = MF_SEARCH_ERROR_ALLOC; + goto FAIL_FREE_MEM; + } + + handle->is_stop = FALSE; + handle->result->is_end = FALSE; + + /*create thread for find item.*/ + handle->thread_h = g_thread_create(__mf_search_find_thread, handle, TRUE, NULL); + if (!handle->thread_h) { + ms_error("fail to create __mf_search_find_thread"); + ret = MF_SEARCH_ERROR_INTERNAL; + goto FAIL_FREE_MEM; + } + /*create idler for reporting find result.*/ + handle->state = MF_SEARCH_STATE_SEARCH; + __mf_search_cmd_unlock(handle); + return MF_SEARCH_ERROR_NONE; + +FAIL_FREE_MEM: + if (args) { + __mf_search_args_free(args); + handle->args = NULL; + } + + if (result) { + __mf_search_result_free(result); + handle->result = NULL; + } + + if (handle->thread_mutex) { + g_mutex_free(handle->thread_mutex); + handle->thread_mutex = NULL; + } + + if (handle->thread_h) { + __mf_search_thread_lock(handle); + handle->is_stop = TRUE; + __mf_search_thread_unlock(handle); + g_thread_join(handle->thread_h); + handle->thread_h = NULL; + } + __mf_search_cmd_unlock(handle); + + return ret; +} + +int _mf_search_stop(ms_handle_t *handle) +{ + ms_debug(""); + + if (!handle) { + ms_error("handle is NULL"); + return MF_SEARCH_ERROR_INVAL_P; + } + + if (handle->state != MF_SEARCH_STATE_SEARCH) { + ms_error("invaild state : %d", handle->state); + return MF_SEARCH_ERROR_INVAL_S; + } + + __mf_search_cmd_lock(handle); + + __mf_search_thread_lock(handle); + handle->is_stop = TRUE; + __mf_search_thread_unlock(handle); + + pthread_mutex_lock(&gLockSearchMsg); + if (flagSearchMsg == 0) { + flagSearchMsg = 1; + pthread_cond_signal(&gCondSearchMsg); + } + pthread_mutex_unlock(&gLockSearchMsg); + + if (handle->thread_h) { + g_thread_join(handle->thread_h); + handle->thread_h = NULL; + } + + if (handle->thread_mutex) { + g_mutex_free(handle->thread_mutex); + handle->thread_mutex = NULL; + } + + if (handle->args) { + __mf_search_args_free(handle->args); + handle->args = NULL; + } + if (handle->result) { + __mf_search_result_free(handle->result); + handle->result = NULL; + } + + handle->state = MF_SEARCH_STATE_INIT; + handle->is_stop = FALSE; + + __mf_search_cmd_unlock(handle); + + return MF_SEARCH_ERROR_NONE; +} + +void _mf_search_finalize(ms_handle_t **handle) +{ + ms_handle_t *ms_handle = *handle; + + ms_debug(""); + + if (!ms_handle) { + ms_warn("invaild handle"); + return; + } + + if (ms_handle->state == MF_SEARCH_STATE_SEARCH) { + mf_search_stop(ms_handle); + } +/* __mf_search_cmd_lock(ms_handle); */ +/* __mf_search_cmd_unlock(ms_handle); */ + + if (ms_handle->cmd_lock) { + g_mutex_free(ms_handle->cmd_lock); + ms_handle->cmd_lock = NULL; + } + g_free(ms_handle); + *handle = NULL; + + return; +} + +/*+++++++++++++++++++++++++ UTIL APIs ++++++++++++++++++++++++++++++ */ +static void __mf_search_tx_wait() +{ + pthread_mutex_lock(&gLockSearchMsg); + while (flagSearchMsg == 0) { + pthread_cond_wait(&gCondSearchMsg, &gLockSearchMsg); + } + flagSearchMsg = 0; + pthread_mutex_unlock(&gLockSearchMsg); +} + +static void __mf_search_result_publish_msg(mf_search_pipe_msg_type type, void *result, void *user_data) +{ + struct appdata *ap = (struct appdata *)user_data; + /*generate message block*/ + mf_search_pipe_msg msg; + memset(&msg, 0, sizeof(mf_search_pipe_msg)); + + msg.mf_sp_msg_type = type; + if (msg.mf_sp_msg_type == MF_SEARCH_PIPE_MSG_RESULT_REPORT) { + msg.report_result = g_strdup((gchar *) result); + msg.current_path = NULL; + } else if (msg.mf_sp_msg_type == MF_SEARCH_PIPE_MSG_ROOT_CHANGE) { + msg.report_result = NULL; + msg.current_path = g_strdup((gchar *) result); + mf_debug("current path is %s", msg.current_path); + } else if (msg.mf_sp_msg_type == MF_SEARCH_PIPE_MSG_FINISHED) { + msg.report_result = result; + msg.current_path = NULL; + } else { + msg.report_result = NULL; + msg.current_path = NULL; + } + + /*write message to pipe*/ + ecore_pipe_write(ap->mf_FileOperation.sync_pipe, &msg, sizeof(msg)); +} + +gchar *_mf_search_result_dir_get(mf_search_result_t * result) +{ + gchar *name = NULL; + if (result) { + GList *list = NULL; + list = result->dir_list; + if (list && list->data) { + gchar *item = (gchar *) list->data; + result->dir_list = g_list_remove(list, item); + name = item; + } + } + return name; +} + +gchar *_mf_search_result_file_get(mf_search_result_t * result) +{ + gchar *name = NULL; + if (result) { + GList *list = NULL; + list = result->file_list; + if (list && list->data) { + gchar *item = (gchar *) list->data; + result->file_list = g_list_remove(list, item); + name = item; + } + } + return name; +} + +gboolean _mf_search_result_is_end(mf_search_result_t *result) +{ + gboolean end = FALSE; + if (result) { + end = result->is_end; + } + return end; +} + +guint _mf_search_result_total_count_get(mf_search_result_t *result) +{ + guint count = 0; + if (result) { + count = result->total_count; + } + return count; +} + +gchar *_mf_search_result_current_dir_get(mf_search_result_t * result) +{ + gchar *c_dir = NULL; + if (result) { + if (result->current_dir) { + c_dir = result->current_dir; + result->current_dir = NULL; + } + } + return c_dir; +} diff --git a/src/common/file-operation/mf-search.c b/src/common/file-operation/mf-search.c new file mode 100644 index 0000000..e44b557 --- /dev/null +++ b/src/common/file-operation/mf-search.c @@ -0,0 +1,137 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include + +#include "mf-dlog.h" +#include "mf-search.h" +#include "mf-search-internal.h" + + +/*+++++++++++++++++++++++ APIs +++++++++++++++++++++++*/ + +int mf_search_init(mf_search_handle *handle) +{ + int ret = 0; + ms_handle_t *ms_handle = NULL; + + if (!handle) { + return -1; + } + if (!g_thread_supported()) { + g_thread_init(NULL); + } + ret = _mf_search_init(&ms_handle); + if (ret < 0) { + ms_error("Fail to init search handle "); + *handle = (mf_search_handle) 0; + return ret; + } + + *handle = (mf_search_handle) ms_handle; + + return MF_SEARCH_ERROR_NONE; +} + +int mf_search_start(mf_search_handle handle, + const char **root_path, + unsigned int path_num, + const char *needle, + mf_search_option option, + void *user_data, + mf_search_filter_cb func, + int category) +{ + int ret = 0; + if (!handle) { + return MF_SEARCH_ERROR_INVAL_P; + } + + if (!root_path || path_num < 1) { + return MF_SEARCH_ERROR_INVAL_P; + } + + if (!needle && !func) { + return MF_SEARCH_ERROR_INVAL_P; + } + ret = _mf_search_start((ms_handle_t *) handle, root_path, path_num, needle, option, user_data, func, category); + + if (ret < 0) { + ms_error("Fail to start search "); + } + return ret; +} + +int mf_search_stop(mf_search_handle handle) +{ + int ret = 0; + + ret = _mf_search_stop((ms_handle_t *) handle); + if (ret < 0) { + ms_error("Fail to stop search "); + } + return ret; +} + +void mf_search_finalize(mf_search_handle *handle) +{ + _mf_search_finalize((ms_handle_t **) handle); + return; +} + +/*+++++++++++++++++++++++ UTIL APIs +++++++++++++++++++++++*/ + +char *mf_search_result_dir_get(mf_search_result_t *result) +{ + return _mf_search_result_dir_get(result); +} + +char *mf_search_result_file_get(mf_search_result_t *result) +{ + return _mf_search_result_file_get(result); +} + +int mf_search_result_is_end(mf_search_result_t *result, int *is_end) +{ + if (result) { + *is_end = _mf_search_result_is_end(result); + } else { + return MF_SEARCH_ERROR_INVAL_P; + } + return MF_SEARCH_ERROR_NONE; +} + +int mf_search_result_total_count_get(mf_search_result_t *result, unsigned int *count) +{ + if (result) { + *count = _mf_search_result_total_count_get(result); + } else { + return MF_SEARCH_ERROR_INVAL_P; + } + return MF_SEARCH_ERROR_NONE; +} + +char *mf_search_result_current_dir_get(mf_search_result_t *result) +{ + return _mf_search_result_current_dir_get(result); +} diff --git a/src/common/file-system/mf-file-attr.c b/src/common/file-system/mf-file-attr.c new file mode 100644 index 0000000..35f0c37 --- /dev/null +++ b/src/common/file-system/mf-file-attr.c @@ -0,0 +1,1344 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include + + +#include "mf-fs-util.h" +#include "mf-util.h" +#include "mf-ta.h" +#include "mf-conf.h" +#include "mf-drm.h" +#include "mf-media-content.h" + +#define MF_UDATE_NUM 1000 +#define MF_PHONE_DEFAULT_LEVEL 3 /*the phone path is /opt/usr/media, it consists of opt and media two parts*/ +#define MF_MMC_DEFAULT_LEVEL 3 /*the mmc path is /opt/storage/sdcard, it consists of opt and storage and sdcard three parts*/ +typedef struct __mf_filter_s mf_filter_s; +struct __mf_filter_s { + char *cond; /*set media type or favorite type, or other query statement*/ + media_content_collation_e collate_type; /*collate type*/ + media_content_order_e sort_type; /*sort type*/ + char *sort_keyword; /*sort keyword*/ + int offset; /*offset*/ + int count; /*count*/ + bool with_meta; /*whether get image or video info*/ +}; +#define CONDITION_LENGTH 200 +#define MF_CONDITION_IMAGE_VIDEO "(MEDIA_TYPE=0 OR MEDIA_TYPE=1)" + +struct _ftype_by_mime { + const char *mime; + fsFileType ftype; +}; + +static struct _ftype_by_mime mime_type[] = { + {"image/png", FILE_TYPE_IMAGE}, + {"image/jpeg", FILE_TYPE_IMAGE}, + {"image/gif", FILE_TYPE_IMAGE}, + {"image/bmp", FILE_TYPE_IMAGE}, + {"image/vnd.wap.wbmp", FILE_TYPE_IMAGE}, + + /*FILE_TYPE_VIDEO */ + {"video/x-msvideo", FILE_TYPE_VIDEO}, + {"video/mp4", FILE_TYPE_VIDEO}, + {"video/3gpp", FILE_TYPE_VIDEO}, + {"video/x-ms-asf", FILE_TYPE_VIDEO}, + {"video/x-ms-wmv", FILE_TYPE_VIDEO}, + {"video/x-matroska", FILE_TYPE_VIDEO}, + + /*FILE_TYPE_MUSIC */ + {"audio/mpeg", FILE_TYPE_MUSIC}, + {"audio/x-wav", FILE_TYPE_MUSIC}, + {"application/x-smaf", FILE_TYPE_MUSIC}, + {"audio/mxmf", FILE_TYPE_MUSIC}, + {"audio/midi", FILE_TYPE_MUSIC}, + {"audio/x-xmf", FILE_TYPE_MUSIC}, + {"audio/x-ms-wma", FILE_TYPE_MUSIC}, + {"audio/aac", FILE_TYPE_MUSIC}, + {"audio/ac3", FILE_TYPE_MUSIC}, + {"audio/ogg", FILE_TYPE_MUSIC}, + {"audio/vorbis", FILE_TYPE_MUSIC}, + {"audio/imelody", FILE_TYPE_MUSIC}, + {"audio/iMelody", FILE_TYPE_MUSIC}, + {"audio/x-rmf", FILE_TYPE_MUSIC}, + {"application/vnd.smaf", FILE_TYPE_MUSIC}, + {"audio/mobile-xmf", FILE_TYPE_MUSIC}, + {"audio/mid", FILE_TYPE_MUSIC}, + {"audio/vnd.ms-playready.media.pya", FILE_TYPE_MUSIC}, + {"audio/imy", FILE_TYPE_MUSIC}, + {"audio/m4a", FILE_TYPE_MUSIC}, + {"audio/melody", FILE_TYPE_MUSIC}, + {"audio/mmf", FILE_TYPE_MUSIC}, + {"audio/mp3", FILE_TYPE_MUSIC}, + {"audio/mp4", FILE_TYPE_MUSIC}, + {"audio/MP4A-LATM", FILE_TYPE_MUSIC}, + {"audio/mpeg3", FILE_TYPE_MUSIC}, + {"audio/mpeg4", FILE_TYPE_MUSIC}, + {"audio/mpg", FILE_TYPE_MUSIC}, + {"audio/mpg3", FILE_TYPE_MUSIC}, + {"audio/smaf", FILE_TYPE_MUSIC}, + {"audio/sp-midi", FILE_TYPE_MUSIC}, + {"audio/wav", FILE_TYPE_MUSIC}, + {"audio/wave", FILE_TYPE_MUSIC}, + {"audio/wma", FILE_TYPE_MUSIC}, + {"audio/xmf", FILE_TYPE_MUSIC}, + {"audio/x-mid", FILE_TYPE_MUSIC}, + {"audio/x-midi", FILE_TYPE_MUSIC}, + {"audio/x-mp3", FILE_TYPE_MUSIC}, + {"audio/-mpeg", FILE_TYPE_MUSIC}, + {"audio/x-mpeg", FILE_TYPE_MUSIC}, + {"audio/x-mpegaudio", FILE_TYPE_MUSIC}, + {"audio/x-mpg", FILE_TYPE_MUSIC}, + {"audio/x-ms-asf", FILE_TYPE_MUSIC}, + {"audio/x-wave", FILE_TYPE_MUSIC}, + + /*FILE_TYPE_PDF */ + {"application/pdf", FILE_TYPE_PDF}, + + /*FILE_TYPE_DOC */ + {"application/msword", FILE_TYPE_DOC}, + {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", FILE_TYPE_DOC}, + + /*FILE_TYPE_PPT */ + {"application/vnd.ms-powerpoint", FILE_TYPE_PPT}, + {"application/vnd.openxmlformats-officedocument.presentationml.presentation", FILE_TYPE_PPT}, + + /*FILE_TYPE_EXCEL */ + {"application/vnd.ms-excel", FILE_TYPE_EXCEL}, + {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", FILE_TYPE_EXCEL}, + + /*FILE_TYPE_VOICE */ + {"audio/AMR", FILE_TYPE_VOICE}, + {"audio/AMR-WB", FILE_TYPE_VOICE}, + {"audio/amr", FILE_TYPE_VOICE}, + {"audio/amr-wb", FILE_TYPE_VOICE}, + {"audio/x-amr", FILE_TYPE_VOICE}, + + /*FILE_TYPE_HTML */ + {"text/html", FILE_TYPE_HTML}, + + /*FILE_TYPE_FLASH */ + {"application/x-shockwave-flash", FILE_TYPE_FLASH}, + {"video/x-flv", FILE_TYPE_FLASH}, + + /*FILE_TYPE_TXT */ + {"text/plain", FILE_TYPE_TXT}, + + /*FILE_TYPE_RSS */ + {"text/x-opml+xml", FILE_TYPE_RSS}, + + /*FILE_TYPE_JAVA */ + {"text/vnd.sun.j2me.app-descriptor", FILE_TYPE_JAVA}, + {"application/x-java-archive", FILE_TYPE_JAVA}, + + /*FILE_TYPE_ETC */ + {NULL, FILE_TYPE_ETC}, +}; + +static char *icon_array[FILE_TYPE_MAX] = { + [FILE_TYPE_DIR] = MF_ICON_FOLDER, + [FILE_TYPE_IMAGE] = MF_ICON_IMAGE, + [FILE_TYPE_VIDEO] = MF_ICON_VIDEO, + [FILE_TYPE_MUSIC] = MF_ICON_MUSIC, + [FILE_TYPE_SOUND] = MF_ICON_SOUND, + [FILE_TYPE_PDF] = MF_ICON_PDF, + [FILE_TYPE_DOC] = MF_ICON_DOC, + [FILE_TYPE_PPT] = MF_ICON_PPT, + [FILE_TYPE_EXCEL] = MF_ICON_EXCEL, + [FILE_TYPE_VOICE] = MF_ICON_VOICE, + [FILE_TYPE_HTML] = MF_ICON_HTML, + [FILE_TYPE_FLASH] = MF_ICON_FLASH, + [FILE_TYPE_TXT] = MF_ICON_TXT, + [FILE_TYPE_VCONTACT] = MF_ICON_VCONTACT, + [FILE_TYPE_VCALENDAR] = MF_ICON_VCALENDAR, + [FILE_TYPE_VNOTE] = MF_ICON_VNOTE, + [FILE_TYPE_RSS] = MF_ICON_RSS, + [FILE_TYPE_JAVA] = MF_ICON_JAVA, +}; + +static char *thumbnail_array[FILE_TYPE_MAX] = { + [FILE_TYPE_DIR] = MF_ICON_THUMBNAIL_FOLDER, + [FILE_TYPE_IMAGE] = MF_ICON_IMAGE, + [FILE_TYPE_VIDEO] = MF_ICON_THUMBNAIL_VIDEO, + [FILE_TYPE_MUSIC] = MF_ICON_THUMBNAIL_MUSIC, + [FILE_TYPE_SOUND] = MF_ICON_THUMBNAIL_RINGTONE, + [FILE_TYPE_PDF] = MF_ICON_THUMBNAIL_PDF, + [FILE_TYPE_DOC] = MF_ICON_THUMBNAIL_DOC, + [FILE_TYPE_PPT] = MF_ICON_THUMBNAIL_PPT, + [FILE_TYPE_EXCEL] = MF_ICON_THUMBNAIL_EXCEL, + [FILE_TYPE_VOICE] = MF_ICON_VOICE, + [FILE_TYPE_HTML] = MF_ICON_THUMBNAIL_HTML, + [FILE_TYPE_FLASH] = MF_ICON_THUMBNAIL_FLASH, + [FILE_TYPE_TXT] = MF_ICON_THUMBNAIL_TXT, + [FILE_TYPE_VCONTACT] = MF_ICON_VCONTACT, + [FILE_TYPE_VCALENDAR] = MF_ICON_VCALENDAR, + [FILE_TYPE_VNOTE] = MF_ICON_VNOTE, + [FILE_TYPE_RSS] = MF_ICON_THUMBNAIL_RSS, + [FILE_TYPE_JAVA] = MF_ICON_JAVA, +}; + +/********************* +**Function name: __mf_file_attr_get_category_by_file_ext +**Parameter: const char* file_ext +**Return value: fsFileType +** +**Action: +** Get file category by extention +** +*********************/ +static fsFileType __mf_file_attr_get_category_by_file_ext(const char *file_ext, const char *fullpath) +{ + int i = 0; + + if (file_ext == NULL) { + return FILE_TYPE_ETC; + } + + if (file_ext[0] == '.') { + i = 1; + } + + switch (file_ext[i]) { + case 'a': + case 'A': + if (strcasecmp("ASF", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("AMR", &file_ext[i]) == 0) { + return FILE_TYPE_VOICE; + } + if (strcasecmp("AWB", &file_ext[i]) == 0) { + return FILE_TYPE_VOICE; + } + if (strcasecmp("AAC", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + if (strcasecmp("AVI", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("AAC", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + + break; + case 'b': + case 'B': + if (strcasecmp("BMP", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + break; + case 'd': + case 'D': + if (strcasecmp("DOC", &file_ext[i]) == 0) { + return FILE_TYPE_DOC; + } + if (strcasecmp("DOCX", &file_ext[i]) == 0) { + return FILE_TYPE_DOC; + } + if (strcasecmp("DIVX", &file_ext[i]) == 0) { + if (mf_drm_is_drm_file(fullpath) == 0) { + return FILE_TYPE_DRM; + } else { + return FILE_TYPE_VIDEO; + } + } + if (strcasecmp("DCF", &file_ext[i]) == 0) { + return FILE_TYPE_DRM; + } + break; + case 'g': + case 'G': + if (strcasecmp("GIF", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("G72", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + break; + case 'h': + case 'H': + if (strcasecmp("H263", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + if (strcasecmp("HTML", &file_ext[i]) == 0) { + return FILE_TYPE_HTML; + } + if (strcasecmp("HTM", &file_ext[i]) == 0) { + return FILE_TYPE_HTML; + } + break; + case 'i': + case 'I': + if (strcasecmp("IMY", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("IPK", &file_ext[i]) == 0) { + return FILE_TYPE_APP; + } + break; + case 'j': + case 'J': + if (strcasecmp("JAD", &file_ext[i]) == 0) { + return FILE_TYPE_JAVA; + } + if (strcasecmp("JAR", &file_ext[i]) == 0) { + return FILE_TYPE_JAVA; + } + + if (strcasecmp("JPG", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("JPEG", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("JPE", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + break; + case 'm': + case 'M': + if (strcasecmp("MMF", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("MP3", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + if (strcasecmp("MID", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("MIDI", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("MP4", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("MPG", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("MPEG", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("M4A", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + if (strcasecmp("M3G", &file_ext[i]) == 0) { + return FILE_TYPE_FLASH; + } + if (strcasecmp("MXMF", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("MKV", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("MKA", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + break; + case 'o': + case 'O': + if (strcasecmp("opml", &file_ext[i]) == 0) { + return FILE_TYPE_RSS; + } + break; + case 'p': + case 'P': + if (strcasecmp("PNG", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("PJPEG", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("PDF", &file_ext[i]) == 0) { + return FILE_TYPE_PDF; + } + if (strcasecmp("PPT", &file_ext[i]) == 0) { + return FILE_TYPE_PPT; + } + if (strcasecmp("PPTX", &file_ext[i]) == 0) { + return FILE_TYPE_PPT; + } + if (strcasecmp("PEM", &file_ext[i]) == 0) { + return FILE_TYPE_CERTIFICATION; + } + break; + case 'r': + case 'R': + break; + case 's': + case 'S': + if (strcasecmp("SDP", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("SPM", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("SMP", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("SPF", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("SWF", &file_ext[i]) == 0) { + return FILE_TYPE_FLASH; + } + if (strcasecmp("SCN", &file_ext[i]) == 0) { + return FILE_TYPE_MOVIE_MAKER; + } + if (strcasecmp("SVG", &file_ext[i]) == 0) { + return FILE_TYPE_SVG; + } + if (strcasecmp("SVGZ", &file_ext[i]) == 0) { + return FILE_TYPE_SVG; + } + break; + case 't': + case 'T': + if (strcasecmp("TXT", &file_ext[i]) == 0) { + return FILE_TYPE_TXT; + } + if (strcasecmp("THM", &file_ext[i]) == 0) { + return FILE_TYPE_THEME; + } + break; + case 'v': + case 'V': + if (strcasecmp("VCF", &file_ext[i]) == 0) { + return FILE_TYPE_VCONTACT; + } + if (strcasecmp("VCS", &file_ext[i]) == 0) { + return FILE_TYPE_VCALENDAR; + } + if (strcasecmp("VNT", &file_ext[i]) == 0) { + return FILE_TYPE_VNOTE; + } + if (strcasecmp("VBM", &file_ext[i]) == 0) { + return FILE_TYPE_VBOOKMARK; + } + break; + case 'w': + case 'W': + if (strcasecmp("WAV", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("WBMP", &file_ext[i]) == 0) { + return FILE_TYPE_IMAGE; + } + if (strcasecmp("WGT", &file_ext[i]) == 0) { + return FILE_TYPE_WGT; + } + if (strcasecmp("WMA", &file_ext[i]) == 0) { + return FILE_TYPE_MUSIC; + } + if (strcasecmp("WMV", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + break; + case 'x': + case 'X': + if (strcasecmp("XLS", &file_ext[i]) == 0) { + return FILE_TYPE_EXCEL; + } + if (strcasecmp("XLSX", &file_ext[i]) == 0) { + return FILE_TYPE_EXCEL; + } + if (strcasecmp("XMF", &file_ext[i]) == 0) { + return FILE_TYPE_SOUND; + } + if (strcasecmp("XHTML", &file_ext[i]) == 0) { + return FILE_TYPE_HTML; + } + break; + case '3': + if (strcasecmp("3GP", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("3GPP", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + if (strcasecmp("3G2", &file_ext[i]) == 0) { + return FILE_TYPE_VIDEO; + } + break; + } + + return FILE_TYPE_ETC; +} + +/********************* +**Function name: mf_get_category +**Parameter: +** const char* filepath: file fullpath +** fsFileType *category: output parameter of category +**Return value: +** error code +** +**Action: +** Get file category by file full path +** +*********************/ +int mf_file_attr_get_file_category(const char *filepath, fsFileType * category) +{ + int i = 0; + int flag = 0; + + if (mf_file_attr_is_dir(filepath)) { + *category = FILE_TYPE_DIR; + return MYFILE_ERR_NONE; + } + + const char *filename = NULL; + filename = ecore_file_file_get(filepath); + if (filename == NULL) { + *category = FILE_TYPE_NONE; + return MYFILE_ERR_SRC_ARG_INVALID; + } + char *file_ext = NULL; + /*ToDo: error file name like the last letter is "." */ + for (i = strlen(filename); i >= 0; i--) { + if (filename[i] == '.') { + file_ext = g_strdup(&filename[i + 1]); + flag = 1; + break; + } + + if (filename[i] == '/') { + flag = 0; + break; + } + } + + if (flag == 1) { + *category = __mf_file_attr_get_category_by_file_ext(file_ext, filepath); + SAFE_FREE_CHAR(file_ext); + return MYFILE_ERR_NONE; + } else { + *category = FILE_TYPE_NONE; + SAFE_FREE_CHAR(file_ext); + return MYFILE_ERR_GET_CATEGORY_FAIL; + } +} + +/********************* +**Function name: mf_file_attr_get_file_stat +**Parameter: +** const char* filename: file name +** fsNodeInfo **node: output parameter of what we need to refine +**Return value: +** error code +** +**Action: +** Get file size and last modified date by file path +** +*********************/ +int mf_file_attr_get_file_stat(const char *filename, fsNodeInfo **node) +{ + struct stat statbuf; + + mf_retvm_if(filename == NULL, MYFILE_ERR_INVALID_ARG, "filename is null"); + mf_retvm_if(node == NULL, MYFILE_ERR_INVALID_ARG, "node is null"); + + if (stat(filename, &statbuf) == -1) { + return MYFILE_ERR_GET_STAT_FAIL; + } + time_t tempdate = statbuf.st_mtime; + (*node)->size = statbuf.st_size; + (*node)->date = (UDate) tempdate * MF_UDATE_NUM; + + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_file_attr_is_dir +**Parameter: +** const char* filename: file fullpath +**Return value: +** if path is a directory, return 1 +** else, return 0 +** +**Action: +** check if the file path is Directory +** +*********************/ +int mf_file_attr_is_dir(const char *filepath) +{ + return ecore_file_is_dir(filepath); +} + +/********************* +**Function name: mf_file_attr_get_store_type_by_full +**Parameter: +** const char* filepath: file full path +** MF_STORAGE *store_type: output parameter of storage type +**Return value: +** error code +** +**Action: +** Get file storage type by file path +** +*********************/ +int mf_file_attr_get_store_type_by_full(const char *filepath, MF_STORAGE * store_type) +{ + if (filepath == NULL || store_type == NULL) { + return MYFILE_ERR_SRC_ARG_INVALID; + } + + if (strncmp(filepath, PHONE_FOLDER, strlen(PHONE_FOLDER)) == 0) { + *store_type = MYFILE_PHONE; + return MYFILE_ERR_NONE; + } else if (strncmp(filepath, MEMORY_FOLDER, strlen(MEMORY_FOLDER)) == 0) { + *store_type = MYFILE_MMC; + return MYFILE_ERR_NONE; + } else { + *store_type = MYFILE_NONE; + return MYFILE_ERR_STORAGE_TYPE_ERROR; + } +} + + +/********************* +**Function name: mf_file_attr_get_file_ext +**Parameter: +** const char* filepath: file full path +** char *file_ext: output parameter of file extension +** +**Return value: +** error code +** +**Action: +** get file extension by file full path +** +*********************/ +int mf_file_attr_get_file_ext(const char *filepath, char **file_ext) +{ + assert(filepath); + assert(file_ext); + const char *filename = NULL; + filename = ecore_file_file_get(filepath); + + if (filename == NULL) { + return MYFILE_ERR_INVALID_FILE_NAME; + } + + char *pdot = strrchr(filename, '.'); + + if (!pdot) { + return MYFILE_ERR_EXT_GET_ERROR; + } else if (pdot != filepath) { + *file_ext = g_strdup(pdot + 1); + return MYFILE_ERR_NONE; + } else { + return MYFILE_ERR_EXT_GET_ERROR; + } +} + +/********************* +**Function name: mf_file_attr_is_duplicated_name +**Parameter: +** const char* dir: dir which we need to check +** const char *name: the file/dir name we need to check +** +**Return value: +** -23 if the name is already existed +** 0 if the name is not existed +** +**Action: +** check if the name is existed in the specified dir +** +*********************/ +int mf_file_attr_is_duplicated_name(const char *dir, const char *name) +{ + + char *file_path = g_strconcat(dir, "/", name, NULL); + if (ecore_file_exists(file_path)) { + SAFE_FREE_CHAR(file_path); + return MYFILE_ERR_DUPLICATED_NAME; + } else { + SAFE_FREE_CHAR(file_path); + return MYFILE_ERR_NONE; + } +} + +/********************* +**Function name: mf_file_attr_is_valid_name +**Parameter: +** const char *filename: the file/dir name we need to check +** +**Return value: +** -0x14 if the name is invalid +** 0 if the name is valid +** +**Action: +** check if the name is valid by file name +** +*********************/ +int mf_file_attr_is_valid_name(const char *filename) +{ + char *pattern; + int ret, z, cflags = 0; + char ebuf[128]; + regex_t reg; + regmatch_t pm[1]; + const size_t nmatch = 1; + /*ToDo: ignore the file star with . */ + if (strncmp(filename, ".", 1) == 0) { + return MYFILE_ERR_INVALID_FILE_NAME; + } + + pattern = MYFILE_NAME_PATTERN; + z = regcomp(®, pattern, cflags); + + if (z != 0) { + regerror(z, ®, ebuf, sizeof(ebuf)); + fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern); + return MYFILE_ERR_INVALID_FILE_NAME; + } + + z = regexec(®, filename, nmatch, pm, 0); + if (z == REG_NOMATCH) { + ret = MYFILE_ERR_NONE; + } else { + ret = MYFILE_ERR_INVALID_FILE_NAME; + } + regfree(®); + return ret; +} + +/********************* +**Function name: mf_file_attr_is_right_dir_path +**Parameter: +** const char *filename: the file/dir name we need to check +** +**Return value: +** error code +** +**Action: +** check if the dir path is correct +** +*********************/ +int mf_file_attr_is_right_dir_path(const char *dir_path) +{ + int result = MYFILE_ERR_NONE; + int length = 0; + + length = strlen(dir_path); + if (length == 0) { + return MYFILE_ERR_INVALID_DIR_PATH; + } + + if (dir_path[length - 1] == '/' && length > 1) { + return MYFILE_ERR_INVALID_DIR_PATH; + } + + if (dir_path[0] != '/') { + return MYFILE_ERR_INVALID_DIR_PATH; + } + + const char *file_name = NULL; + file_name = ecore_file_file_get(dir_path); + result = mf_file_attr_is_valid_name(file_name); + + if (result != MYFILE_ERR_NONE) { + mf_error("Is NOT Valid dir path name"); + } + + return result; +} + +/********************* +**Function name: mf_file_attr_is_right_file_path +**Parameter: +** const char *filename: the file/dir name we need to check +** +**Return value: +** error code +** +**Action: +** check if the file path is correct +** +*********************/ +int mf_file_attr_is_right_file_path(const char *file_path) +{ + int result = MYFILE_ERR_NONE; + + if (strlen(file_path) == 0) { + return MYFILE_ERR_INVALID_FILE_PATH; + } + + if (file_path[0] != '/') { + return MYFILE_ERR_INVALID_DIR_PATH; + } + + const char *file_name = NULL; + file_name = ecore_file_file_get(file_path); + result = mf_file_attr_is_valid_name(file_name); + if (result != MYFILE_ERR_NONE) { + mf_error("Is NOT Valid dir path name"); + } + + return result; +} + +/********************* +**Function name: mf_file_attr_is_right_dir_path +**Parameter: +** const char *filename: the file/dir name we need to check +** +**Return value: +** error code +** +**Action: +** check if the dir path is correct +** +*********************/ +int mf_file_attr_get_parent_path(const char *path, char **parent_path) +{ + assert(path); + assert(parent_path); + mf_debug("Path :::: [%s]", path); + + *parent_path = g_strdup(path); + if (*parent_path == NULL) + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + + const char *name = NULL; + name = ecore_file_file_get(path); + /* + ** input path and parent_path are check in the caller. + ** parent_path is full path must be like /opt/media/file.ext + ** name is file.ext + ** strlen(parent_path) should large than strlen(name) normally. + ** to take exception like input path is "", we add a if condition + */ + if (strlen(*parent_path) > strlen(name)) + (*parent_path)[strlen(*parent_path) - strlen(name) - 1] = '\0'; + + if (strlen(*parent_path) == 0) { + *parent_path = g_strdup("/"); + } + + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_file_attr_get_logical_path_by_full +**Parameter: +** const char *full_path: the full path +** char* path: logic path of output parameter +** +**Return value: +** error code +** +**Action: +** get logic path by full path +** +*********************/ +int mf_file_attr_get_logical_path_by_full(const char *full_path, char **path) +{ + assert(full_path); + assert(path); + MF_STORAGE store_type = 0; + int root_len = 0; + int error_code = 0; + + error_code = mf_file_attr_get_store_type_by_full(full_path, &store_type); + + *path = g_strdup(full_path); + if (*path == NULL) { + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + + memset(*path, 0, strlen(*path)); + switch (store_type) { + case MYFILE_PHONE: + root_len = strlen(PHONE_FOLDER); + break; + case MYFILE_MMC: + root_len = strlen(MEMORY_FOLDER); + break; + default: + return MYFILE_ERR_STORAGE_TYPE_ERROR; + } + + /* + ** *path has the same length with full_path + ** strlen(*path) is 0 since the memset called + ** we use length of full_path to reprecent the *path's + */ + g_strlcpy(*path, full_path + root_len, strlen(full_path)); + if (strlen(*path) == 0) { + SAFE_FREE_CHAR(*path); + *path = g_strdup("/"); + } + + return MYFILE_ERR_NONE; +} + + +typedef struct __mf_transfer_data_s mf_transfer_data_s; + +struct __mf_transfer_data_s { + const char *file_path; + char *thumbnail_path; + media_info_h *media; +}; + +static bool __mf_local_data_get_media_thumbnail_cb(media_info_h media, void *data) +{ + mf_retvm_if(data == NULL, -1, "filter is NULL"); + mf_transfer_data_s *tmp_data = (mf_transfer_data_s *)data; + + + media_info_clone(tmp_data->media, media); + media_info_get_thumbnail_path(media, &(tmp_data->thumbnail_path)); + + return false; +} + +int mf_file_attr_get_file_icon(const char *file_path, int *error_code, int view_type, const char **thumbnail, media_info_h *media_info) +{ + int index = 0; + const char *icon_path = DEFAULT_ICON; + fsFileType ftype = FILE_TYPE_NONE; + const char *mime = NULL; + int thumbnail_type = MF_THUMBNAIL_TYPE_DEFAULT; + mf_retvm_if(file_path == NULL, thumbnail_type, "file_path is NULL"); + + mime = efreet_mime_type_get(file_path); + if (mime == NULL) { + mf_warnig("Fail to efreet_mime_type_get(), set etc icon"); + + return thumbnail_type; + } + + for (index = 0; mime_type[index].mime; index++) { + if (strncmp(mime, mime_type[index].mime, strlen(mime)) == 0) { + ftype = mime_type[index].ftype; + break; + } + } + + if (view_type == 0) { + icon_path = mf_file_attr_get_default_icon_by_type(ftype); + thumbnail_type = MF_THUMBNAIL_TYPE_DEFAULT; + } else { + icon_path = mf_file_attr_get_default_thumbnail_by_type(ftype); + thumbnail_type = MF_THUMBNAIL_TYPE_DEFAULT; + } + + switch (ftype) { + case FILE_TYPE_IMAGE: + case FILE_TYPE_VIDEO: + { + + int err = 0; + mf_transfer_data_s tmp_data; + memset(&tmp_data,0x00,sizeof(mf_transfer_data_s)); + tmp_data.file_path = file_path; + tmp_data.media = media_info; + //err = mf_file_attr_get_thumbnail(&tmp_data); + char *condition = NULL; + condition = g_strdup_printf("%s and MEDIA_PATH=\"%s\"", MF_CONDITION_IMAGE_VIDEO, tmp_data.file_path); + err = mf_media_content_data_get(&tmp_data, condition, __mf_local_data_get_media_thumbnail_cb); + if (err == 0) { + icon_path = g_strdup(tmp_data.thumbnail_path); + thumbnail_type = MF_THUMBNAIL_TYPE_THUMBNAIL; + } else { + icon_path = NULL; + if (error_code) + *error_code = err; + } + SAFE_FREE_CHAR(tmp_data.thumbnail_path); + } + break; + default: + break; + } + + *thumbnail = icon_path; + return thumbnail_type; +} + +fsFileType mf_file_attr_get_file_type(const char *mime) +{ + int index; + fsFileType ftype = FILE_TYPE_NONE; + for (index = 0; mime_type[index].mime; index++) { + if (strncmp(mime, mime_type[index].mime, strlen(mime)) == 0) { + ftype = mime_type[index].ftype; + } + } + return ftype; + +} + +fsFileType mf_file_attr_get_file_type_by_mime(const char *file_path) +{ + int index; + fsFileType ftype = FILE_TYPE_NONE; + const char *mime = NULL; + + mime = efreet_mime_type_get(file_path); + if (mime == NULL) { + mf_warnig("Fail to efreet_mime_type_get(), set etc icon"); + + return ftype; + } + + for (index = 0; mime_type[index].mime; index++) { + if (strncmp(mime, mime_type[index].mime, strlen(mime)) == 0) { + ftype = mime_type[index].ftype; + return ftype; + } + } + + + return ftype; +} + +const char *mf_file_attr_get_default_icon_by_type(fsFileType ftype) +{ + const char *icon_path = DEFAULT_ICON; + + if (icon_array[ftype]) { + icon_path = icon_array[ftype]; + } else { + icon_path = DEFAULT_ICON; + } + + return icon_path; +} + +const char *mf_file_attr_get_default_thumbnail_by_type(fsFileType ftype) +{ + + const char *thumbnail_path = DEFAULT_ICON; + + if (thumbnail_array[ftype]) { + thumbnail_path = thumbnail_array[ftype]; + } else { + thumbnail_path = DEFAULT_ICON; + } + + return thumbnail_path; +} +/********************* +**Function name: mf_file_attr_get_path_level +**Parameter: +** const char *file_fullpath: the full path +** int* level: level which the specified path under(this is output parameter) +** +**Return value: +** error code +** +**Action: +** get level of specified path under +** +*********************/ +int mf_file_attr_get_path_level(const char *fullpath, int *level) +{ + if (fullpath == NULL) { + return MYFILE_ERR_SRC_ARG_INVALID; + } + + if (mf_file_attr_is_right_dir_path(fullpath) != 0) { + return MYFILE_ERR_INVALID_PATH; + } + + MF_STORAGE storage_t = 0; + int start_level = 0; + int error_code = mf_file_attr_get_store_type_by_full(fullpath, &storage_t); + if (error_code != 0) { + return error_code; + } + + if (storage_t == MYFILE_PHONE) { + start_level = MF_PHONE_DEFAULT_LEVEL; + } else if (storage_t == MYFILE_MMC) { + start_level = MF_MMC_DEFAULT_LEVEL; + } + + char *temp = strdup(fullpath); + if (temp == NULL) { + return MYFILE_ERR_UNKNOWN_ERROR; + } + int count = 0; + + gchar **result = NULL; + gchar **params = NULL; + result = g_strsplit(temp, "/", 0); + if (result == NULL) { + free(temp); + temp = NULL; + return MYFILE_ERR_UNKNOWN_ERROR; + } + for (params = result; *params; params++) { + mf_debug("*params is [%s]", *params); + count++; + } + + g_strfreev(result); + *level = count - start_level - 1; + mf_debug("cout is [%d] start level is [%d]", count, start_level); + free(temp); + return MYFILE_ERR_NONE; + +} + +/********************* +**Function name: mf_file_attr_is_in_system_folder +**Parameter: +** const char *file_fullpath: the full path +** int* level: level which the specified path under +** bool* result: output parameter for the result +** +**Return value: +** error code +** +**Action: +** check if the specified path is under system folder +** +*********************/ +int mf_file_attr_is_in_system_folder(char *fullpath, int level, bool * result) +{ + if (fullpath == NULL) { + return MYFILE_ERR_SRC_ARG_INVALID; + } + + MF_STORAGE storage_t = 0; + int error_code = mf_file_attr_get_store_type_by_full(fullpath, &storage_t); + if (error_code != 0) { + return error_code; + } + + const char *name = NULL; + name = ecore_file_file_get(fullpath); + char *parent_path = NULL; + error_code = mf_file_attr_get_parent_path(fullpath, &parent_path); + + if (error_code != 0) { + return error_code; + } + + if (storage_t == MYFILE_PHONE || storage_t == MYFILE_MMC) { + if (level == 1) { + if ((strlen(name) == strlen(DEFAULT_FOLDER_CAMERA_SHOTS)) && strcmp(name, DEFAULT_FOLDER_CAMERA_SHOTS) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_IMAGE)) && strcmp(name, DEFAULT_FOLDER_IMAGE) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_VIDEO)) && strcmp(name, DEFAULT_FOLDER_VIDEO) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_MUSIC)) && strcmp(name, DEFAULT_FOLDER_MUSIC) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_DOWNLOADS)) && strcmp(name, DEFAULT_FOLDER_DOWNLOADS) == 0) { + *result = true; + } else { + if (storage_t == MYFILE_PHONE) { + if ((strlen(name) == strlen(DEFAULT_FOLDER_ALERTS_AND_RINGTONES)) && strcmp(name, DEFAULT_FOLDER_ALERTS_AND_RINGTONES) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_BOOKMARK)) && strcmp(name, DEFAULT_FOLDER_BOOKMARK) == 0) { + *result = true; + } else if ((strlen(name) == strlen(DEFAULT_FOLDER_RSS)) && strcmp(name, DEFAULT_FOLDER_RSS) == 0) { + *result = true; + } else { + *result = false; + } + } else { + *result = false; + } + } + + } else if (level == 2) { + const char *parent_name = NULL; + parent_name = ecore_file_file_get(parent_path); + if (storage_t == MYFILE_PHONE) { + if (!g_strcmp0(parent_name, DEFAULT_FOLDER_IMAGE) && !g_strcmp0(name, SUB_FODER_WALLPAPER)) { + *result = true; + } else if (!g_strcmp0(parent_name, DEFAULT_FOLDER_ALERTS_AND_RINGTONES) + && (!g_strcmp0(name, SUB_FODER_ALERTS) || !g_strcmp0(name, SUB_FODER_RINGTONES))) { + *result = true; + } else if (!g_strcmp0(parent_name, DEFAULT_FOLDER_MUSIC) + && (!g_strcmp0(name, SUB_FODER_FM) || !g_strcmp0(name, SUB_FODER_VOICE_RECORD))) { + *result = true; + } else { + *result = false; + } + } else { + *result = false; + } + } else { + if (parent_path) { + free(parent_path); + parent_path = NULL; + } + return MYFILE_ERR_STORAGE_TYPE_ERROR; + } + } + + else { + if (parent_path) { + free(parent_path); + parent_path = NULL; + } + *result = false; + return MYFILE_ERR_STORAGE_TYPE_ERROR; + } + if (parent_path) { + free(parent_path); + parent_path = NULL; + } + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_file_attr_is_system_dir +**Parameter: +** const char *file_fullpath: the full path +** bool* result: output parameter for the result +** +**Return value: +** error code +** +**Action: +** check if the specified path is system folder +** +*********************/ +int mf_file_attr_is_system_dir(char *fullpath, bool * result) +{ + if (fullpath == NULL) { + mf_error("source argument invalid"); + return MYFILE_ERR_SRC_ARG_INVALID; + } + + if (mf_file_attr_is_dir(fullpath) == 0) { + mf_error("source is not exist"); + return MYFILE_ERR_SRC_NOT_EXIST; + } + + int level = 0; + int error_code = 0; + + error_code = mf_file_attr_get_path_level(fullpath, &level); + if (error_code != 0) { + mf_error("Fail to get path level"); + return error_code; + } + + if (level >= 3 || level <= 0) { + *result = false; + mf_error("Path Level is wrong"); + return MYFILE_ERR_NONE; + } + error_code = mf_file_attr_is_in_system_folder(fullpath, level, result); + + if (error_code != 0) { + mf_error("Fail .. is in system folder err :: %d", error_code); + return error_code; + } + + return MYFILE_ERR_NONE; +} + +#ifdef MYFILE_USB_OTG +int mf_file_attr_is_disk_link(const char *fullpath, bool *result) +{ + if (fullpath == NULL) { + mf_error("source argument invalid"); + return MYFILE_ERR_SRC_ARG_INVALID; + } + assert(result); + if (mf_file_attr_is_dir(fullpath) == 0) { + mf_error("source is not exist"); + return MYFILE_ERR_SRC_NOT_EXIST; + } + + int error_code = 0; + char *parent_path = NULL; + *result = false; + error_code = mf_file_attr_get_parent_path(fullpath, &parent_path); + + if(error_code == 0){ + if(g_strcmp0(parent_path, OTG_FOLDER) == 0) + *result = true; + else + *result = false; + } + SAFE_FREE_CHAR(parent_path); + return error_code; +} +#endif + +#define MF_ROUND_D(x, dig) (floor((x)*pow(10, dig+1)+0.5)/pow(10, dig+1)) +void mf_file_attr_get_file_size_info(char **file_size, fsNodeInfo *pNode) +{ + MF_TRACE_BEGIN; + mf_retm_if(file_size == NULL, "file_size is NULL"); + mf_retm_if(pNode == NULL, "pNode is NULL"); + unsigned long long original_size = 0; + double size = 0; + int index = 0; + int len = 0; + + original_size = pNode->size; + size = (double)original_size; + + while (size >= MYFILE_BASIC_SIZE) { + size /= MYFILE_BASIC_SIZE; + index++; + } + + if (index == SIZE_BYTE) { + snprintf(NULL, 0, "%llu B%n", original_size, &len); + } else { + size = MF_ROUND_D(size, 1); + snprintf(NULL, 0, "%0.1lf XB%n", size, &len); + } + + if (len <= 0) { + *file_size = NULL; + return; + } + len += 1; + *file_size = (char *)calloc(len, sizeof(char)); + if (*file_size == NULL) { + return; + + } + + if (index == SIZE_BYTE) { + snprintf(*file_size, len, "%llu B", original_size); + } else { + if (index == SIZE_KB) { + snprintf(*file_size, len, "%0.1lf KB", size); + } else if (index == SIZE_MB) { + snprintf(*file_size, len, "%0.1lf MB", size); + } else if (index == SIZE_GB) { + snprintf(*file_size, len, "%0.1lf GB", size); + } else { + free(*file_size); + *file_size = NULL; + } + } + MF_TRACE_END; + return; +} diff --git a/src/common/file-system/mf-fs-oper.c b/src/common/file-system/mf-fs-oper.c new file mode 100644 index 0000000..7c3d213 --- /dev/null +++ b/src/common/file-system/mf-fs-oper.c @@ -0,0 +1,803 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include + +#include "mf-fs-util.h" +#include "mf-util.h" + +static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; +static int __mf_fs_oper_sort_by_date_cb_O2R(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_name_cb_A2Z(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_type_cb_A2Z(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_size_cb_S2L(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_name_cb_Z2A(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_date_cb_R2O(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_type_cb_Z2A(const void *d1, const void *d2); +static int __mf_fs_oper_sort_by_size_cb_L2S(const void *d1, const void *d2); + +/********************* +**Function name: mf_fs_oper_print_node +**Parameter: +** fsNodeInfo *pNode: the file system node information need to print +** +**Return value: +** void +** +**Action: +** printf the file system node information for debug +** +*********************/ +void mf_fs_oper_print_node(fsNodeInfo *pNode) +{ + if (pNode) { + /*mf_debug("path is [%s]\nname is [%s]\ndate is [%s]\ntype is [%d]\nsize is [%u]\nextension is [%s]\n\n",pNode->path, + pNode->name,asctime(gmtime(&(pNode->date))),pNode->type,pNode->size, pNode->ext); + */ + } +} + +/********************* +**Function name: mf_fs_oper_get_file +**Parameter: +** const char *path: full path to get file name +** +**Return value: +** const char*: file name +** +**Action: +** get file name from full path +** +*********************/ +static const char *mf_fs_oper_get_file(const char *path) +{ + char *result = NULL; + + if (!path) { + return NULL; + } + if ((result = strrchr(path, '/'))) { + result++; + } else { + result = (char *)path; + } + return result; +} + +/********************* +**Function name: mf_fs_oper_error +**Parameter: +** const char* src: source path +** const char* dst: destination path +** int check_option: check option +** +**Return value: +** error code +** +**Action: +** input parameter checking +** +*********************/ +int mf_fs_oper_error(const char *src, const char *dst, int check_option) +{ + if ((check_option & MF_ERROR_CHECK_SRC_ARG_VALID) && (src == NULL)) { + return MYFILE_ERR_SRC_ARG_INVALID; + } + if ((check_option & MF_ERROR_CHECK_DST_ARG_VALID) && (dst == NULL)) { + return MYFILE_ERR_DST_ARG_INVALID; + } + + if ((check_option & MF_ERROR_CHECK_SRC_EXIST) && (!ecore_file_exists(src))) { + return MYFILE_ERR_SRC_NOT_EXIST; + } + if ((check_option & MF_ERROR_CHECK_DST_EXIST) && (!ecore_file_exists(dst))) { + return MYFILE_ERR_DST_NOT_EXIST; + } + + if (check_option & MF_ERROR_CHECK_SRC_PATH_VALID) { + if (!ecore_file_is_dir(src)) { + if (mf_file_attr_is_right_file_path(src)) { + return MYFILE_ERR_INVALID_FILE_PATH; + } + } else { + if (mf_file_attr_is_right_dir_path(src)) { + return MYFILE_ERR_INVALID_DIR_PATH; + } + } + } + if (check_option & MF_ERROR_CHECK_DST_PATH_VALID) { + if (!ecore_file_is_dir(dst)) { + int ret = mf_file_attr_is_right_file_path(dst); + if (ret != 0) { + return ret; + } + } else { + int ret = mf_file_attr_is_right_dir_path(dst); + if (ret != 0) { + return ret; + } + } + } + + if (check_option & MF_ERROR_CHECK_SRC_PARENT_DIR_EXIST) { + char *parent_path = NULL; + if (mf_file_attr_get_parent_path(src, &parent_path)) { + if (!ecore_file_exists(parent_path)) { + SAFE_FREE_CHAR(parent_path); + return MYFILE_ERR_DIR_NOT_FOUND; + } + } + SAFE_FREE_CHAR(parent_path); + } + + if (check_option & MF_ERROR_CHECK_DST_PARENT_DIR_EXIST) { + char *parent_path = NULL; + if (mf_file_attr_get_parent_path(dst, &parent_path)) { + if (!ecore_file_exists(parent_path)) { + SAFE_FREE_CHAR(parent_path); + return MYFILE_ERR_DIR_NOT_FOUND; + } + } + SAFE_FREE_CHAR(parent_path); + } + + if (check_option & MF_ERROR_CHECK_DUPLICATED) { + char *parent_path = NULL; + + if (!mf_file_attr_get_parent_path(dst, &parent_path)) { + if (mf_file_attr_is_duplicated_name(parent_path, mf_fs_oper_get_file(dst))) { + SAFE_FREE_CHAR(parent_path); + return MYFILE_ERR_DUPLICATED_NAME; + } + SAFE_FREE_CHAR(parent_path); + } else { + SAFE_FREE_CHAR(parent_path); + return MYFILE_ERR_GET_PARENT_PATH_FAIL; + } + } + + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_fs_oper_read_dir +**Parameter: +** char *path: path which we need to read +** Eina_List** dir_list: output parameter of dir list under specified path +** Eina_List** file_list: output parameter of file list under specified path +** +**Return value: +** error code +** +**Action: +** read element under the specified path +** +*********************/ +int mf_fs_oper_read_dir(const char *path, Eina_List ** dir_list, Eina_List ** file_list) +{ + DIR *pDir = NULL; + struct dirent *ent; + + mf_retvm_if(path == NULL, MYFILE_ERR_INVALID_ARG, "path is null"); + mf_retvm_if(dir_list == NULL, MYFILE_ERR_INVALID_ARG, "dir_list is null"); + mf_retvm_if(file_list == NULL, MYFILE_ERR_INVALID_ARG, "file_list is null"); + int option = MF_ERROR_CHECK_SRC_ARG_VALID | MF_ERROR_CHECK_SRC_EXIST | MF_ERROR_CHECK_SRC_PATH_VALID; + int ret = mf_fs_oper_error(path, NULL, option); + if (ret != MYFILE_ERR_NONE) { + return ret; + } + + pDir = opendir(path); + + if (pDir == NULL) { + return MYFILE_ERR_DIR_OPEN_FAIL; + } + + while ((ent = readdir(pDir)) != NULL) { + GString *childpath = NULL; + fsNodeInfo *pNode = NULL; + + if (strncmp(ent->d_name, ".", strlen(".")) == 0 || strncmp(ent->d_name, "..", strlen("..")) == 0) { + continue; + } + + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + continue; + } + if ((ent->d_type & DT_DIR) != 0) { + if ((strlen(path) == strlen(PHONE_FOLDER)) && (strcmp(path, PHONE_FOLDER) == 0) + && (strlen(ent->d_name) == strlen(DEBUG_FOLDER)) && (strcmp(ent->d_name, DEBUG_FOLDER) == 0)) { + continue; + } + } + + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + + if (pNode == NULL) { + continue; + } + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(path); + /*set name */ + pNode->name = g_strdup(ent->d_name); + /*set type */ + if (ent->d_type & DT_DIR) { + pNode->type = FILE_TYPE_DIR; + } else if (ent->d_type & DT_REG) { + mf_file_attr_get_file_category(ent->d_name, &(pNode->type)); + } + /*set date & size */ + childpath = g_string_new(path); + if (childpath == NULL) { + + free(pNode); + pNode = NULL; + continue; + } + g_string_append_printf(childpath, "/%s", ent->d_name); + mf_file_attr_get_file_stat(childpath->str, &pNode); + if (pNode->type == FILE_TYPE_DIR) { + *dir_list = eina_list_append(*dir_list, pNode); + } else { + ret = mf_file_attr_get_file_ext(childpath->str, &pNode->ext); + if (ret != MYFILE_ERR_NONE) { + pNode->ext = NULL; + } + *file_list = eina_list_append(*file_list, pNode); + } + + g_string_free(childpath, TRUE); + } + closedir(pDir); + + return MYFILE_ERR_NONE; +} + + +static int __mf_fs_oper_sort_by_priority(const void *d1, const void *d2, int sequence_type) +{ + int ret = 0; + switch(sequence_type) { + case MF_SORT_BY_PRIORITY_TYPE_A2Z: + ret = __mf_fs_oper_sort_by_date_cb_O2R(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_size_cb_S2L(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_name_cb_A2Z(d1, d2); + } + } + break; + case MF_SORT_BY_PRIORITY_TYPE_Z2A: + ret = __mf_fs_oper_sort_by_date_cb_R2O(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_size_cb_L2S(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_name_cb_Z2A(d1, d2); + } + } + break; + case MF_SORT_BY_PRIORITY_DATE_O2R: + ret = __mf_fs_oper_sort_by_size_cb_S2L(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_name_cb_A2Z(d1, d2); + } + break; + case MF_SORT_BY_PRIORITY_DATE_R2O: + ret = __mf_fs_oper_sort_by_size_cb_L2S(d1, d2); + if (ret == 0) { + ret = __mf_fs_oper_sort_by_name_cb_Z2A(d1, d2); + } + break; + case MF_SORT_BY_PRIORITY_SIZE_S2L: + ret = __mf_fs_oper_sort_by_name_cb_A2Z(d1, d2); + break; + case MF_SORT_BY_PRIORITY_SIZE_L2S: + ret = __mf_fs_oper_sort_by_name_cb_Z2A(d1, d2); + break; + default: + break; + } + return ret; +} +/********************* +**Function name: __sort_by_name_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 > d2 +** +**Action: +** sort the list order by the Assic table + +** +*********************/ +static int __mf_fs_oper_sort_by_name_cb_A2Z(const void *d1, const void *d2) +{ + fsNodeInfo *txt1 = (fsNodeInfo *) d1; + fsNodeInfo *txt2 = (fsNodeInfo *) d2; + gchar *name1 = NULL; + gchar *name2 = NULL; + int result = 0; + + if (!txt1 || !txt1->name) { + return (1); + } + if (!txt2 || !txt2->name) { + return (-1); + } + + name1 = g_ascii_strdown(txt1->name, strlen(txt1->name)); + if (name1 == NULL) { + return (-1); + } + name2 = g_ascii_strdown(txt2->name, strlen(txt2->name)); + if (name2 == NULL) { + g_free(name1); + name1 = NULL; + return (-1); + } + result = g_strcmp0(name1, name2); + + g_free(name1); + name1 = NULL; + g_free(name2); + name2 = NULL; + return result; + +} + +/********************* +**Function name: __sort_by_date_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 > d2 +** +**Action: +** sort the list order by the later created the later shown +*********************/ +static int __mf_fs_oper_sort_by_date_cb_O2R(const void *d1, const void *d2) +{ + int ret = 0; + fsNodeInfo *time1 = (fsNodeInfo *) d1; + fsNodeInfo *time2 = (fsNodeInfo *) d2; + + if (!d1) { + return 1; + } + if (!d2) { + return -1; + } + + if (time1->date > time2->date) { + ret = 1; + } else if (time1->date < time2->date) { + ret = -1; + } else { + ret = 0; + } + + if (ret == 0) { + ret = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_DATE_O2R); + } + return ret; +} + +/********************* +**Function name: __sort_by_type_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 < d2 +** 0 if d1 = d2 +** 1 if d1 > d2 +** +**Action: +** sort the list order by the category type value +*********************/ +static int __mf_fs_oper_sort_by_type_cb_A2Z(const void *d1, const void *d2) +{ + fsNodeInfo *type1 = (fsNodeInfo *) d1; + fsNodeInfo *type2 = (fsNodeInfo *) d2; + gchar *ext1 = NULL; + gchar *ext2 = NULL; + int result = 0; + + if (type1 == NULL || type1->ext == NULL) { + return 1; + } + + if (type2 == NULL || type2->ext == NULL) { + return -1; + } + ext1 = g_ascii_strdown(type1->ext, strlen(type1->ext)); + if (ext1 == NULL) { + return (-1); + } + ext2 = g_ascii_strdown(type2->ext, strlen(type2->ext)); + if (ext2 == NULL) { + g_free(ext1); + ext1 = NULL; + return (-1); + } + result = g_strcmp0(ext1, ext2); + + g_free(ext1); + ext1 = NULL; + g_free(ext2); + ext2 = NULL; + + if (result == 0) { + result = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_TYPE_A2Z); + } + + return result; +} + +/*order: the one with smaller size will be shown earlier*/ +/********************* +**Function name: __sort_by_name_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 > d2 +** +**Action: +** sort the list order by size, rule is the smaller the later shown +*********************/ +static int __mf_fs_oper_sort_by_size_cb_S2L(const void *d1, const void *d2) +{ + int ret = 0; + fsNodeInfo *size1 = (fsNodeInfo *) d1; + fsNodeInfo *size2 = (fsNodeInfo *) d2; + + if (!d1) { + return 1; + } + + if (!d2) { + return -1; + } + + if (size1->size > size2->size) { + ret = 1; + } else if (size1->size < size2->size) { + ret = -1; + } else { + ret = 0; + } + + if (ret == 0) { + ret = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_SIZE_S2L); + } + return ret; +} + +/********************* +**Function name: __mf_fs_oper_sort_by_name_cb_Z2A +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** 1 if d1 > d2 +** -1 if d1 <= d2 +** +**Action: +** sort the list order by the Assic table + +** +*********************/ +static int __mf_fs_oper_sort_by_name_cb_Z2A(const void *d1, const void *d2) +{ + fsNodeInfo *txt1 = (fsNodeInfo *) d1; + fsNodeInfo *txt2 = (fsNodeInfo *) d2; + + int result = 0; + + if (!txt1 || !txt1->name) { + return (1); + } + if (!txt2 || !txt2->name) { + return (-1); + } + result = strcasecmp(txt1->name, txt2->name); + + if (result < 0) { + return (1); + } else { + return (-1); + } +} + +/********************* +**Function name: __sort_by_date_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 < d2 +** +**Action: +** sort the list order by the later created the later shown +*********************/ +static int __mf_fs_oper_sort_by_date_cb_R2O(const void *d1, const void *d2) +{ + int ret = 0; + fsNodeInfo *time1 = (fsNodeInfo *) d1; + fsNodeInfo *time2 = (fsNodeInfo *) d2; + + if (!d1) { + return -1; + } + if (!d2) { + return 1; + } + if (time1->date > time2->date) { + ret = -1; + } else if (time1->date < time2->date) { + ret = 1; + } else { + ret = 0; + } + + if (ret == 0) { + ret = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_DATE_R2O); + } + return ret; +} + +/********************* +**Function name: __sort_by_type_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 < d2 +** +**Action: +** sort the list order by the category type value +*********************/ +static int __mf_fs_oper_sort_by_type_cb_Z2A(const void *d1, const void *d2) +{ + fsNodeInfo *type1 = (fsNodeInfo *) d1; + fsNodeInfo *type2 = (fsNodeInfo *) d2; + gchar *ext1 = NULL; + gchar *ext2 = NULL; + int result = 0; + + if (type1 == NULL || type1->ext == NULL) { + return -1; + } + + if (type2 == NULL || type2->ext == NULL) { + return 1; + } + + ext1 = g_ascii_strdown(type1->ext, strlen(type1->ext)); + if (ext1 == NULL) { + return (1); + } + ext2 = g_ascii_strdown(type2->ext, strlen(type2->ext)); + if (ext2 == NULL) { + g_free(ext1); + ext1 = NULL; + return (-1); + } + result = g_strcmp0(ext1, ext2); + g_free(ext1); + ext1 = NULL; + g_free(ext2); + ext2 = NULL; + if (result == 0) { + result = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_TYPE_Z2A); + } + + return -result; +} + +/*order: the one with smaller size will be shown earlier*/ +/********************* +**Function name: __sort_by_name_cb +**Parameter: +** const void *d1: node1 to compare +** const void *d2: node2 to compare +** +**Return value: +** -1 if d1 > d2 +** 0 if d1 = d2 +** 1 if d1 < d2 +** +**Action: +** sort the list order by size, rule is the smaller the later shown +*********************/ +static int __mf_fs_oper_sort_by_size_cb_L2S(const void *d1, const void *d2) +{ + int ret = 0; + fsNodeInfo *size1 = (fsNodeInfo *) d1; + fsNodeInfo *size2 = (fsNodeInfo *) d2; + + if (!d1) { + return -1; + } + + if (!d2) { + return 1; + } + + if (size1->size > size2->size) { + ret = -1; + } else if (size1->size < size2->size) { + ret = 1; + } else { + ret = 0; + } + + if (ret == 0) { + ret = __mf_fs_oper_sort_by_priority(d1, d2, MF_SORT_BY_PRIORITY_SIZE_L2S); + } + return ret; +} + +/********************* +**Function name: mf_fs_oper_sort_list +**Parameter: +** Eina_List **list: the list we need to sort +** int sort_opt: sort option +** +**Return value: +** void +** +**Action: +** sort the list order by sort option with the call back +*********************/ +void mf_fs_oper_sort_list(Eina_List **list, int sort_opt) +{ + Eina_Compare_Cb sort_func = NULL; + Eina_List *l = NULL; + fsNodeInfo *data = NULL; + if (!(*list)) { + return; + } + switch (sort_opt) { + case MYFILE_SORT_BY_NAME_A2Z: + sort_func = __mf_fs_oper_sort_by_name_cb_A2Z; + break; + case MYFILE_SORT_BY_TYPE_A2Z: + sort_func = __mf_fs_oper_sort_by_type_cb_A2Z; + break; + case MYFILE_SORT_BY_SIZE_S2L: + sort_func = __mf_fs_oper_sort_by_size_cb_S2L; + break; + case MYFILE_SORT_BY_DATE_O2R: + sort_func = __mf_fs_oper_sort_by_date_cb_O2R; + break; + case MYFILE_SORT_BY_NAME_Z2A: + sort_func = __mf_fs_oper_sort_by_name_cb_Z2A; + break; + case MYFILE_SORT_BY_TYPE_Z2A: + sort_func = __mf_fs_oper_sort_by_type_cb_Z2A; + break; + case MYFILE_SORT_BY_SIZE_L2S: + sort_func = __mf_fs_oper_sort_by_size_cb_L2S; + break; + case MYFILE_SORT_BY_DATE_R2O: + sort_func = __mf_fs_oper_sort_by_date_cb_R2O; + break; + default: + sort_func = __mf_fs_oper_sort_by_type_cb_A2Z; + break; + } + EINA_LIST_FOREACH(*list, l, data) { + mf_fs_oper_print_node(data); + } + *list = eina_list_sort(*list, eina_list_count(*list), sort_func); + EINA_LIST_FOREACH(*list, l, data) { + mf_fs_oper_print_node(data); + } +} + + +/********************* +**Function name: mf_fs_oper_create_dir +**Parameter: +** const char *file: dir need to be operation +** +**Return value: +** error code +** +**Action: +** create dir +*********************/ +int mf_fs_oper_create_dir(const char *dir) +{ + int option = MF_ERROR_CHECK_SRC_ARG_VALID | MF_ERROR_CHECK_DUPLICATED; + int ret = mf_fs_oper_error(dir, dir, option); + + if (ret != 0) { + return ret; + } + + ret = mf_file_attr_is_right_dir_path(dir); + + if (ret != 0) { + return ret; + } + + if (mkdir(dir, default_mode) < 0) { + return MYFILE_ERR_DIR_CREATE_FAIL; + } + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_fs_oper_rename_file +**Parameter: +** const char *src: source file need to rename +** const char *dst: destination file which is to be renamed + +** +**Return value: +** error code +** +**Action: +** rename a file +*********************/ +int mf_fs_oper_rename_file(const char *src, const char *dst) +{ + mf_debug(); + int option = MF_ERROR_CHECK_SRC_ARG_VALID | MF_ERROR_CHECK_DST_ARG_VALID | + MF_ERROR_CHECK_SRC_EXIST | MF_ERROR_CHECK_DST_PATH_VALID | + MF_ERROR_CHECK_SRC_PATH_VALID | MF_ERROR_CHECK_SRC_PATH_VALID | MF_ERROR_CHECK_DST_PARENT_DIR_EXIST | MF_ERROR_CHECK_DUPLICATED; + int ret = mf_fs_oper_error(src, dst, option); + + if (ret != 0) { + return ret; + } + + mf_debug("src is %s\ndst is %s\n", src, dst); + if (rename(src, dst)) { + return MYFILE_ERR_RENAME_FAIL; + } else { + return MYFILE_ERR_NONE; + } +} diff --git a/src/common/mf-callback.c b/src/common/mf-callback.c new file mode 100644 index 0000000..1a93d3c --- /dev/null +++ b/src/common/mf-callback.c @@ -0,0 +1,4995 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#include + + +#include + +#include +#include +#include +#include "mf-main.h" +#include "mf-conf.h" +#include "mf-util.h" +#include "mf-callback.h" +#include "mf-fm-svc-wrapper.h" + +#include "mf-widget.h" +#include "mf-fs-util.h" +#include "mf-launch.h" +#include "mf-dlog.h" +#include "mf-inotify-handle.h" +#include "mf-copy.h" +#include "mf-delete.h" +#include "mf-move.h" +#include "mf-otg.h" +#include "mf-resource.h" +#include "mf-language-mgr.h" +#include "mf-s-beam.h" +#include "mf-share.h" + + +struct appdata *temp_data; +pthread_mutex_t pb_mutex = PTHREAD_MUTEX_INITIALIZER; +/* mutex for refresh */ +pthread_mutex_t refresh_mutex = PTHREAD_MUTEX_INITIALIZER; +/* mutex for dbus message */ +pthread_mutex_t refresh_lock; +pthread_cond_t refresh_finished; +unsigned int refresh_flag = 0; +typedef struct _mf_dir_event_t { + int event; + char *name; +} mf_dir_event_t; + +void mf_callback_save_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_cancel_cb(void *data, Evas_Object * obj, void *event_info); +static void __mf_callback_mmc_removed(void *data, MF_STORAGE storage); + +/****************************** +** Prototype : mf_callback_warning_popup_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_warning_popup_cb(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(MF_BUTTON_LABEL_OK)) == 0 ) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + } +} + +/****************************** +** Prototype : mf_callback_app_rotate_cb +** Description : +** Input : enum appcore_rm mode +** void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +#ifdef MYFILE_SPLIT_VIEW + +static Eina_Bool __mf_callback_do_rotation_cb (void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = data; + assert(ap); + + mf_widget_create(ap); + mf_widget_set_main_layout_content(ap); + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_split_view_refresh(ap); + } + } + + if (ap->mf_Status.more == MORE_RENAME || ap->mf_Status.more == MORE_SEARCH || ap->mf_Status.more == MORE_CREATE_FOLDER || (ap->mf_Status.more == MORE_RENAME && ap->mf_Status.preMore == MORE_SEARCH)) { + if (ap->mf_MainWindow.pEntry) { + if (ap->mf_Status.flagIME != EINA_FALSE) { + if (ap->mf_MainWindow.pNormalPopup == NULL) { + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_TRUE); + } + } + } + } + if (ap->mf_Status.more == MORE_SEARCH) { + if (ap->mf_MainWindow.pSearchEntry) { + if (ap->mf_Status.flagIME != EINA_FALSE) { + if (ap->mf_MainWindow.pNormalPopup == NULL) { + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_TRUE); + } + } + } + } + MF_TRACE_END; + + return ECORE_CALLBACK_CANCEL; +} + +void mf_callback_app_rotate_cb(app_device_orientation_e mode, void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = data; + assert(ap); + + if (ap->mf_Status.pre_rotate_type == mode) + return; + + const char *config = elm_config_profile_get(); + if (!strcmp(config, "desktop")) + return; + + enum ug_event evt = UG_EVENT_NONE; + + switch (mode) { + case APP_DEVICE_ORIENTATION_270: + ap->mf_Status.rotation_angle = -90; + ap->mf_Status.view_mode_end = FALSE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_270; + evt = UG_EVENT_ROTATE_LANDSCAPE; + break; + + case APP_DEVICE_ORIENTATION_90: + ap->mf_Status.rotation_angle = 90; + ap->mf_Status.view_mode_end = FALSE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_90; + evt = UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN; + break; + + case APP_DEVICE_ORIENTATION_180: + ap->mf_Status.rotation_angle = 180; + ap->mf_Status.view_mode_end = TRUE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_180; + evt = UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN; + break; + + case APP_DEVICE_ORIENTATION_0 : + default: + ap->mf_Status.rotation_angle = 0; + ap->mf_Status.view_mode_end = TRUE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_0; + evt = UG_EVENT_ROTATE_PORTRAIT; + break; + } + + ug_send_event(evt); + + if (ap->mf_MainWindow.pContextPopup) { + evas_object_del(ap->mf_MainWindow.pContextPopup); + ap->mf_MainWindow.pContextPopup = NULL; + ap->mf_Status.flagCtxPopShow = EINA_TRUE; + } else { + ap->mf_Status.flagCtxPopShow = EINA_FALSE; + } + + if (mode == APP_DEVICE_ORIENTATION_270 || mode == APP_DEVICE_ORIENTATION_90) { + ap->mf_Status.rotation_type = MF_ROTATE_LANDSCAPE; + } else { + ap->mf_Status.rotation_type = MF_ROTATE_PORTRAIT; + } + if (ap->mf_Status.flagNoContent) { + elm_object_signal_emit(ap->mf_MainWindow.pConformant, "elm,state,virtualkeypad,disable", ""); + elm_object_signal_emit(ap->mf_MainWindow.pConformant, "elm,state,clipboard,disable", ""); + } + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, ap->mf_Status.rotation_angle); + __mf_callback_do_rotation_cb(ap); + + MF_TRACE_END; +} + +#else + +void mf_callback_app_rotate_cb(app_device_orientation_e mode, void *data) +{ + struct appdata *ap = data; + assert(ap); + + ap->mf_Status.rotation_type = mode; + + if (ap->mf_FileOperation.ugImageViewer) { + enum ug_mode md = ug_get_mode(ap->mf_FileOperation.ugImageViewer); + enum ug_event ev = UG_EVENT_ROTATE_LANDSCAPE; + if (md == UG_MODE_FULLVIEW) { + switch (mode) { + case APP_DEVICE_ORIENTATION_0 : + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, 0); + ev = UG_EVENT_ROTATE_PORTRAIT; + break; + case APP_DEVICE_ORIENTATION_180: + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, 180); + ev = UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN; + break; + case APP_DEVICE_ORIENTATION_270: + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, 270); + ev = UG_EVENT_ROTATE_LANDSCAPE; + break; + case APP_DEVICE_ORIENTATION_90: + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, 90); + ev = UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN; + break; + default: + break; + } + /*send event to ug */ + ug_send_event(ev); + } + } +} +#endif + +#ifdef MYFILE_SPLIT_VIEW +void mf_callback_storage_cb(void *data, const char *label) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(label == NULL, "label is NULL"); + + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap->mf_Status.path == NULL, "ap->mf_Status.path is NULL"); + mf_retm_if(ap->mf_Status.path->str == NULL, "ap->mf_Status.path->str is NULL"); + Evas_Object *pNaviBar = NULL; + myfileNaviBar *pNavi_s_inuse = NULL; + myfileNaviBar *pNavi_s_toshow = NULL; + myfileNaviBar *pNaviBarStruct = NULL; + char *rootpath = NULL; + int current_storage = MYFILE_PHONE; + int current_more = ap->mf_Status.more; + pNavi_s_inuse = mf_navi_bar_get_in_use(ap); + + current_storage = mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str); + + if (ap->mf_Status.more == MORE_SEARCH) { + ap->mf_Status.more = MORE_DEFAULT; + } + pNavi_s_inuse->naviFlagInUse = FALSE; + pNaviBarStruct = mf_navi_bar_get_navi_from_navilist(ap->mf_MainWindow.plistNaviBar, label); + + + if (pNaviBarStruct == NULL) { + /*2.0 get root path by storage label */ + rootpath = mf_fm_svc_wrapper_get_root_path_by_tab_label(label); + CHAR_CHECK_NULL_GOTO(rootpath, ERROR_EXIT); + + /*2.1 create the navi for the tab */ + pNavi_s_toshow = malloc(sizeof(myfileNaviBar)); + CHAR_CHECK_NULL_GOTO(pNavi_s_toshow, ERROR_EXIT); + memset(pNavi_s_toshow, 0, sizeof(myfileNaviBar)); + + pNavi_s_toshow->naviFlagInUse = TRUE; + /*2.2 set path as root path of the storage */ + pNavi_s_toshow->pCurrentPath = g_strdup(rootpath); + pNavi_s_toshow->pNaviLabel = strdup(label); + free(rootpath); + /*2.3 insert phone navi into the navi_list */ + ap->mf_MainWindow.plistNaviBar = eina_list_append(ap->mf_MainWindow.plistNaviBar, pNavi_s_toshow); + + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + ap->mf_Status.path = g_string_new(pNavi_s_toshow->pCurrentPath); + if (ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE) { + SAFE_FREE_GSTRING(pNavi_s_toshow->pre_operation.path); + pNavi_s_toshow->pre_operation.path = g_string_new(pNavi_s_toshow->pCurrentPath); + } + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) { + mf_navi_bar_create_path_select_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + + ap->mf_Status.more = current_more; + goto SUCCESS_EXIT; + } else { + /*2.1 get the navi of the tab */ + pNaviBar = ap->mf_MainWindow.pNaviBar; + pNavi_s_toshow = mf_navi_bar_get_struct_by_label(ap, label); + pNavi_s_toshow->naviFlagInUse = TRUE; + + /*2.2 set related status value. */ + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + + ap->mf_Status.path = g_string_new(pNavi_s_toshow->pCurrentPath); + /*2.3 update the content to catch update */ + /*Todo: How to ensure insert only once */ + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) { + mf_navi_bar_create_path_select_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + goto SUCCESS_EXIT; + } + + +ERROR_EXIT: + SAFE_FREE_CHAR(pNavi_s_toshow); + SAFE_FREE_CHAR(rootpath); + MF_TRACE_END; + return; + +SUCCESS_EXIT: + MF_TRACE_END; + return; + +} +#endif + +/****************************** +** Prototype : tab_callback +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_tab_cb(void *data, const char * path) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + struct appdata *ap = (struct appdata *)data; + + const char *label = NULL; + Evas_Object *pNaviBar = NULL; + myfileNaviBar *pNavi_s_toshow = NULL; + myfileNaviBar *pNavi_s_inuse = NULL; +#if 0 + Elm_Object_Item *it = NULL; + it = (Elm_Object_Item *)event_info; + label = elm_object_item_text_get(it); +#endif + int optStorage = 0; + optStorage = mf_fm_svc_wrapper_get_location(path); + switch (optStorage) { + case MYFILE_PHONE: + label = GET_SYS_STR(MF_LABEL_PHONE); + break; + case MYFILE_MMC: + label = GET_SYS_STR(MF_LABEL_MMC); + break; + case MYFILE_OTG: + label = GET_STR(MF_LABEL_OTG); + break; + default: + break; + } + + + if (ap->mf_Status.more == MORE_RENAME) + mf_callback_destory_rename(ap); + + if (label != NULL) { + pNavi_s_inuse = mf_navi_bar_get_in_use(ap); + if (pNavi_s_inuse == NULL || pNavi_s_inuse->pNaviLabel == NULL) { + MF_TRACE_END; + return; + } + + +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_callback_storage_cb(ap, label); + MF_TRACE_END; + return; + } +#endif + /*0. set the previous navi to be out of use */ + pNavi_s_inuse->naviFlagInUse = FALSE; + /*1. get navi bar pointer by the label */ + pNaviBar = ap->mf_MainWindow.pNaviBar; + pNavi_s_toshow = mf_navi_bar_get_navi_from_navilist(ap->mf_MainWindow.plistNaviBar, label); + /*2. create navi bar if not created, otherwise get it by pNaviBar */ + if (pNavi_s_toshow == NULL) { + /*2.0 get root path by storage label */ + char *rootpath = mf_fm_svc_wrapper_get_root_path_by_tab_label(label); + if (rootpath == NULL) { + MF_TRACE_END; + return; + } + /*2.1 create the navi for the tab */ + pNavi_s_toshow = malloc(sizeof(myfileNaviBar)); + if (pNavi_s_toshow == NULL) { + free(rootpath); + rootpath = NULL; + mf_debug("pNavi_s_toshow is NULL"); + MF_TRACE_END; + return; + } + memset(pNavi_s_toshow, 0, sizeof(myfileNaviBar)); + + pNavi_s_toshow->naviFlagInUse = TRUE; + /*2.2 set path as root path of the storage */ + pNavi_s_toshow->pCurrentPath = g_strdup(rootpath); + pNavi_s_toshow->pNaviLabel = strdup(label); + free(rootpath); + /*2.3 insert phone navi into the navi_list */ + ap->mf_MainWindow.plistNaviBar = eina_list_append(ap->mf_MainWindow.plistNaviBar, pNavi_s_toshow); + + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = g_string_new(pNavi_s_toshow->pCurrentPath); + if (ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE) { + pNavi_s_toshow->pre_operation.path = g_string_new(pNavi_s_toshow->pCurrentPath); + mf_navi_bar_create_path_select_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else { + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + MF_TRACE_END; + + + } else { + /*2.1 get the navi of the tab */ + pNavi_s_toshow = mf_navi_bar_get_struct_by_label(ap, label); + pNavi_s_toshow->naviFlagInUse = TRUE; + char *rootpath = mf_fm_svc_wrapper_get_root_path_by_tab_label(label); + + /*2.2 set related status value. */ + SAFE_FREE_GSTRING(ap->mf_Status.path); + SAFE_FREE_CHAR(pNavi_s_toshow->pCurrentPath); + ap->mf_Status.path = g_string_new(rootpath); + pNavi_s_toshow->pCurrentPath = rootpath; + /*2.3 update the content to catch update */ + /*Todo: How to ensure insert only once */ + if ((ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE)) { + mf_navi_bar_create_path_select_view(ap); + } else { + mf_navi_bar_create_default_view(ap); + } + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + MF_TRACE_END; + } + + } + +} + +/****************************** +** Prototype : click_callback +** Description : +** Input : struct appdata* data +** mfAction key +** GString* path +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_upper_folder_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + GString *parent_path = NULL; + int error_code = 0; + int mmc_card = 0; + error_code = mf_util_is_mmc_on(&mmc_card); + + parent_path = mf_fm_svc_wrapper_get_file_parent_path(ap->mf_Status.path); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = parent_path; + + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(parent_path->str); + + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + } + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); +} + +void mf_callback_upper_button_pressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *upper_button_ic = (Evas_Object *)data; + elm_image_file_set(upper_button_ic, MF_TITLE_ICON_UPPER_PRESS, NULL); +} + +void mf_callback_upper_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *upper_button_ic = (Evas_Object *)data; + elm_image_file_set(upper_button_ic, MF_TITLE_ICON_UPPER, NULL); +} + +void mf_callback_upper_click_cb(void *data, Evas_Object * obj, void *event_info) +{ + assert(data); + struct appdata *ap = data; + + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + if (ap->mf_Status.more == MORE_CREATE_FOLDER) { + return; + } + + if (ap->mf_Status.view_type == mf_view_root) { + return; + } + mf_callback_remove_dir_watch(); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_callback_destory_rename(ap); + } + + if (ap->mf_MainWindow.pNaviItem) { + mf_navi_bottom_item_del(&ap->mf_MainWindow.pNaviItem); + } + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + GString *parent_path = NULL; + + if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + ap->mf_Status.view_type = mf_view_root; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_set_panes_navi_to_main(ap); + } +#endif + + } else { + parent_path = mf_fm_svc_wrapper_get_file_parent_path(ap->mf_Status.path); + + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + ap->mf_Status.path = parent_path; +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + int storage = mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str); + if (storage == MYFILE_OTG) { /* a usb disk take into use */ + char *dev_in_use = mf_otg_get_node_in_use(ap); + if (dev_in_use != NULL) + mf_otg_set_node_using_flag(ap, dev_in_use, FALSE); + } else { + } +#endif + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(parent_path->str); + + } + + + mf_widget_refresh_view(ap); + + +} + +#ifdef MYFILE_SPLIT_VIEW +void mf_callback_left_click_cb(struct appdata *data, GString * path, Elm_Object_Item *item) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + mf_retm_if(path->str == NULL, "path->str is NULL"); + + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL) { + return; + } + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + Evas_Object *pGenlist = NULL; + + int locate = mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str); + int click_locate = MYFILE_PHONE; + + pGenlist = ap->mf_MainWindow.sSplitData.pSplitLeftGenlist; + + click_locate = mf_fm_svc_wrapper_get_location(path->str); + + if (locate == click_locate) { + + int error_code = 0; + int mmc_card = 0; + bool result = FALSE; + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + error_code = mf_util_is_mmc_on(&mmc_card); + if (ap->mf_Status.more == MORE_DEFAULT || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_SEARCH) { + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(path->str); + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = g_strdup(path->str); +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + error_code = 0; + error_code = mf_file_attr_is_disk_link(path->str, &result); + if (error_code == 0 && result == TRUE) { /* a usb disk take into use */ + /* + **we don't need to set the previous device flag to be false + **because click cannot jump from one device to another + */ + mf_otg_set_node_using_flag(ap, path->str,TRUE); + } +#endif + /*set new path */ + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) { + mf_navi_bar_create_path_select_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + } + + } else { + + if (g_strcmp0(path->str, PHONE_FOLDER) == 0) { + mf_callback_storage_cb(ap, GET_SYS_STR(MF_LABEL_PHONE)); + } else if (g_strcmp0(path->str, MEMORY_FOLDER) == 0) { + mf_callback_storage_cb(ap, GET_SYS_STR(MF_LABEL_MMC)); + } else if (g_strcmp0(path->str, OTG_FOLDER) == 0) { + mf_callback_storage_cb(ap, GET_STR(MF_LABEL_OTG)); + } + } + + MF_TRACE_END; +} +#endif +void mf_callback_click_cb(struct appdata *data, mfAction key, GString * path) +{ + mf_debug("Start"); + assert(data); + mf_debug("key:%d path:%s\n", key, path->str); + + struct appdata *ap = data; + if (ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL) { + return; + } + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + if (ap->mf_Status.view_type == mf_view_root) { + ap->mf_Status.view_type = mf_view_normal; + mf_callback_tab_cb(ap, path->str); + return; + } + GString *new_path = NULL; + + int error_code = 0; + int mmc_card = 0; + bool result = FALSE; + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + + error_code = mf_util_is_mmc_on(&mmc_card); + if (ap->mf_Status.more == MORE_DEFAULT || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_SEARCH) { + if (key == MFACTION_CLICK) { + if (mf_fm_svc_wrapper_is_dir(path)) { + if (ap->mf_Status.more == MORE_SEARCH) { + if (ap->mf_FileOperation.search_result_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.search_result_list), MYFILE_TYPE_CHAR); + } + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_FALSE); + ap->mf_Status.more = MORE_DEFAULT; + + } + new_path = g_string_new(path->str); + +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + error_code = 0; + error_code = mf_file_attr_is_disk_link(new_path->str, &result); + if (error_code == 0 && result == TRUE) { /* a usb disk take into use */ + /* + **we don't need to set the previous device flag to be false + **because click cannot jump from one device to another + */ + mf_otg_set_node_using_flag(ap, new_path->str,TRUE); + } +#endif + /*set new path */ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = new_path; + + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(new_path->str); + mf_widget_refresh_view(ap); + } else { + struct timeval mytime; + gettimeofday(&mytime, NULL); + mf_debug("[myfiles click time] %ld sec %ld usec \n", mytime.tv_sec, mytime.tv_usec); + + int ret = 0; + ret = mf_launch_service(ap, path->str); + mf_debug("ret is %d\n", ret); + } + } + + else if (key == MFACTION_FLICK) { + mf_debug("flick\n"); + } + } +} + +/****************************** +** Prototype : __mf_callback_imk_cancel_cb +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_callback_imk_cancel_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + mf_callback_cancel_cb(ap, NULL, NULL); + return 0; +} + +/****************************** +** Prototype : mf_callback_illegal_char_popup_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_illegal_char_popup_cb(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(MF_BUTTON_LABEL_YES)) == 0 ) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + + Evas_Object *entry = ap->mf_MainWindow.pEntry; + if (entry != NULL) + elm_object_focus_set(entry, EINA_TRUE); + } else if (g_strcmp0(label, GET_SYS_STR(MF_BUTTON_LABEL_NO)) == 0 ) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + ecore_idler_add((Ecore_Task_Cb) __mf_callback_imk_cancel_cb, ap); + } + +} + +/****************************** +** Prototype : __mf_ime_mkdir_cb +** Description : +** Input : void *data +** char* fileName +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_callback_ime_mkdir_cb(void *data, char *fileName) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + assert(fileName); + + int ret = 0; + const char *message = NULL; + const char *left_label = NULL; + const char *right_label = NULL; + + left_label = GET_SYS_STR(MF_BUTTON_LABEL_YES); + right_label = GET_SYS_STR(MF_BUTTON_LABEL_NO); + if (strlen(fileName)) { + + if (ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL) { + mf_debug("ap->mf_Status.path is NULL\n"); + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + GString *fullpathdir = g_string_new(ap->mf_Status.path->str); + + if (fullpathdir == NULL) { + mf_util_operation_alloc_failed(ap); + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + /*check the space */ + gchar *test_space = g_strstrip(fileName); + if (test_space == NULL) { + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + mf_util_operation_alloc_failed(ap); + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + mf_debug("====================================fileName is [%s] test_space is [%s]", fileName, test_space); + + GString *fullpathname = g_string_new(test_space); + + if (fullpathname == NULL) { + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + mf_util_operation_alloc_failed(ap); + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + + if (strlen(test_space) == 0) { + message = GET_STR(MF_POPUP_MSG_NAME_INVALID); /*TODO */ + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, + mf_callback_illegal_char_popup_cb, ap); + + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + return MYFILE_ERR_DIR_CREATE_FAIL; + } + + /*check if input name is valid */ + if (mf_file_attr_is_valid_name(fullpathname->str) == MYFILE_ERR_INVALID_FILE_NAME) { + + message = GET_STR(MF_MSG_ILLEGAL_CHAR); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, + mf_callback_illegal_char_popup_cb, ap); + mf_debug("Name contains illegal character!!!"); + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + + return MYFILE_ERR_DIR_CREATE_FAIL; + } + + GString *fullpath = NULL; + char *temp_fullpath = g_strconcat(fullpathdir->str, "/", fullpathname->str, NULL); + if (temp_fullpath) { + fullpath = g_string_new(temp_fullpath); + + free(temp_fullpath); + temp_fullpath = NULL; + if (fullpath == NULL) { + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + mf_util_operation_alloc_failed(ap); + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + } else { + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + + mf_debug("length is %d\n", strlen(fileName)); + mf_debug("fullpath is %s\n", fullpath->str); + /*check whether DIR name is override(DIR name has no extention) */ + /*check whether path length is override */ + if ((strlen(fullpathdir->str) + strlen(fullpathname->str)) > MYFILE_FILE_PATH_LEN_MAX) { + + message = GET_STR(MF_MSG_PATH_REACH_MAX_LEN); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, + mf_callback_illegal_char_popup_cb, ap); + mf_debug("Full path length should be less than 4096 Retry!!!"); + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + ret = MYFILE_ERR_DIR_CREATE_FAIL; + } + /*check if duplicated name */ + else if (mf_file_attr_is_duplicated_name(ap->mf_Status.path->str, test_space) == MYFILE_ERR_DUPLICATED_NAME) { + message = GET_STR(MF_MSG_DUP_NAME); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, + mf_callback_illegal_char_popup_cb, ap); + + mf_debug("Duplicated Name, Retry?"); + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + ret = MYFILE_ERR_DIR_CREATE_FAIL; + } + /*check if DIR name is all spaces */ + else { + ret = mf_fm_svc_wrapper_create_service(ap, fullpath); + /*check whether operate on read only area */ + if (errno == EROFS) { + message = GET_STR(MF_MSG_OPER_READ_ONLY); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + ret = MYFILE_ERR_DIR_CREATE_FAIL; + } else if (ret) { + message = GET_STR(MF_MSG_CREATE_DIR_FAILED); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + mf_debug("create folder error %d \n", ret); + } + + g_string_free(fullpathdir, TRUE); + fullpathdir = NULL; + g_string_free(fullpathname, TRUE); + fullpathname = NULL; + g_string_free(fullpath, TRUE); + fullpath = NULL; + + } + } else { + message = GET_STR(MF_MSG_EMPTY_FOLDER_NAME); + + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, mf_callback_illegal_char_popup_cb, ap); + ret = MYFILE_ERR_DIR_CREATE_FAIL; + } + return ret; +} + +/****************************** +** Prototype : mf_callback_cancel_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_cancel_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + mf_retm_if(ap->mf_Status.path == NULL, "ap->mf_Status.path is NULL"); + mf_retm_if(ap->mf_Status.path->str == NULL, "ap->mf_Status.path->str is NULL"); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + Evas_Object *newContent; + + Eina_List *l = NULL; + void *item = NULL; + myfileNaviBar *pNavi_s = NULL; + myfileNaviBar *pNavi_toshow = NULL; + int flagTabbar = 0; + switch (ap->mf_Status.more) { + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + mf_debug(); + if (ap->mf_FileOperation.source != NULL) { + g_string_free(ap->mf_FileOperation.source, TRUE); + ap->mf_FileOperation.source = NULL; + } + /*1. state set */ + /*1.1 status set to default */ + ap->mf_Status.preMore = ap->mf_Status.more; + ap->mf_Status.more = MORE_EDIT; + flagTabbar = mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str); + /*1.2 free the path to set it to the one just when edit clicked later */ + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + /*2. navigation bar state recovery */ + EINA_LIST_FOREACH(ap->mf_MainWindow.plistNaviBar, l, item) { + pNavi_s = (myfileNaviBar *) item; + /*2.2 pop all the temprory views */ + /*2.3 recover the path just before when edit click */ + pNavi_s->pCurrentPath = strdup(pNavi_s->pre_operation.path->str); + /*2.5 set navi related status */ + if (pNavi_s->naviFlagEditStart == TRUE) { + /*2.5-1 set path in mf_status */ + ap->mf_Status.path = g_string_new(pNavi_s->pCurrentPath); + /*2.5-2 set InUse flag */ + pNavi_s->naviFlagInUse = TRUE; + /*2.5-3 set pNavi_toshow for refreshing */ + pNavi_toshow = pNavi_s; + } else { + pNavi_s->naviFlagInUse = FALSE; + } + } + + if (pNavi_toshow == NULL) { + mf_debug("pNavi_toshow is NULL"); + return; + } + + + ap->mf_Status.more = MORE_DEFAULT; + if (ap->mf_Status.view_type == mf_view_root) { + ap->mf_Status.view_type = ap->mf_Status.preViewType; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.preViewType != mf_view_root_category) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + } else { + ap->mf_Status.view_type = ap->mf_Status.preViewType; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.preViewType == mf_view_root_category) { + mf_navi_bar_set_panes_navi_to_main(ap); + } + } +#endif + } + + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + + ap->mf_Status.more = MORE_EDIT; + mf_widget_refresh_view(ap); + + ap->mf_Status.preMore = MORE_DEFAULT; + return; + case MORE_RENAME: + mf_callback_destory_rename(ap); + if (ap->mf_Status.preMore == MORE_SEARCH) { + goto SEARCH_CANCEL; + } + break; + /* when cancle rename, just destory the rename relative, and then the mode will change to Edit + then do what cancle edit do, so here not need "break" */ + case MORE_EDIT: + case MORE_SHARE_EDIT: + /*1 pop edit view */ + if (ap->mf_MainWindow.pLabelLayout) { + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "sel_contents"); + if (ap->mf_MainWindow.pLabelLayout) + evas_object_del(ap->mf_MainWindow.pLabelLayout); + + ap->mf_MainWindow.pLabelLayout = NULL; + } + ap->mf_Status.flagFolderSelect = FALSE; + ap->mf_Status.flagFileSelect = FALSE; + pNavi_toshow = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_toshow == NULL, "get navi in use failed"); + ap->mf_Status.more = MORE_DEFAULT; + /*3. refresh the content of the view */ + + mf_navi_bar_recover_info_box(ap, pNavi_toshow); + Evas_Object *btn = NULL; + btn = elm_object_item_part_content_unset(ap->mf_MainWindow.pNaviItem, TITLE_LEFT_BTN); + SAFE_FREE_OBJ(btn); + + mf_genlist_update_default_view_item_style(ap); + newContent = mf_navi_bar_content_create(ap); + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, newContent); + + //mf_ctrl_bar_reset(ap); + mf_navi_bar_reset_ctrl_button(ap); + mf_navi_add_back_button(ap); + /*4. set tab enable */ + mf_navi_bar_title_set(ap); + break; + case MORE_SEARCH: + SEARCH_CANCEL: +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + /**** 1. unset naviframe from mainlayout **/ + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + + if (ap->mf_FileOperation.search_result_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.search_result_list), MYFILE_TYPE_CHAR); + } + + if (ap->mf_Status.search_handler > 0) { + mf_search_stop(ap->mf_Status.search_handler); + mf_search_finalize(&ap->mf_Status.search_handler); + } + ap->mf_Status.more = MORE_DEFAULT; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + evas_object_del(ap->mf_MainWindow.pEntry); + ap->mf_MainWindow.pSearchEntry = NULL; + + mf_widget_refresh_view(ap); + ap->mf_Status.preMore = MORE_DEFAULT; + + break; + case MORE_CREATE_FOLDER: +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + ap->mf_Status.more = ap->mf_Status.preMore; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + evas_object_del(ap->mf_MainWindow.pEntry); + ap->mf_MainWindow.pEntry = NULL; + mf_widget_imf_hide_callback_del(ap->mf_MainWindow.pConformant); + + mf_widget_refresh_view(ap); + + mf_callback_imf_state_callback_del(ap); + + break; + case MORE_THUMBNAIL_RENAME: +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + ap->mf_Status.more = MORE_DEFAULT;//ap->mf_Status.preMore; + ap->mf_Status.preMore = MORE_THUMBNAIL_RENAME; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + evas_object_del(ap->mf_MainWindow.pEntry); + ap->mf_MainWindow.pEntry = NULL; + mf_widget_imf_hide_callback_del(ap->mf_MainWindow.pConformant); + mf_callback_imf_state_callback_del(ap); + + mf_widget_refresh_view(ap); + ap->mf_Status.preMore = MORE_DEFAULT; + break; + default: + ap->mf_Status.more = MORE_DEFAULT; + /*4. set tab enable */ + break; + } + + if (ap->mf_MainWindow.pLabel) { + evas_object_del(ap->mf_MainWindow.pLabel); + ap->mf_MainWindow.pLabel = NULL; + } +} + +/****************************** +** Prototype : __mf_popup_show_vk_cb +** Description : Samsung +** Input : void *data +** Evas_Object * obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_popup_show_vk_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Evas_Object *pEntry = NULL; + + evas_object_del(ap->mf_MainWindow.pNormalPopup); + + ap->mf_MainWindow.pNormalPopup = NULL; + + pEntry = ap->mf_MainWindow.pEntry; + elm_entry_cursor_end_set(ap->mf_MainWindow.pEntry); + + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_TRUE); + MF_TRACE_END; + +} + +static void __mf_callback_refresh_rename(void *data, GString *pre_name, GString *new_name) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pre_name == NULL, "pre_name is NULL"); + mf_retm_if(pre_name->str == NULL, "pre_name->str is NULL"); + mf_retm_if(new_name == NULL, "new_name is NULL"); + mf_retm_if(new_name->str == NULL, "new_name->str is NULL"); + struct appdata *ap = (struct appdata *)data; + + mfItemData_s *item_data = NULL; + + item_data = elm_object_item_data_get(ap->mf_FileOperation.rename_item); + if (item_data == NULL) { + return; + } + + if (g_string_equal(item_data->m_ItemName, pre_name)) { + g_string_free(item_data->m_ItemName, TRUE); + item_data->m_ItemName = g_string_new(new_name->str); + elm_object_item_data_set(ap->mf_FileOperation.rename_item, item_data); + elm_genlist_item_update(ap->mf_FileOperation.rename_item); + if (ap->mf_Status.view_type == mf_view_root_category) { + mf_util_update_item_from_list_by_name(&ap->mf_FileOperation.category_list, pre_name->str, new_name->str); + } + } + mf_callback_destory_rename(ap); +} + +void mf_callback_destory_rename(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); + + if (ap->mf_Status.more != MORE_RENAME) { + return; + } + + myfileNaviBar *pNavi_toshow = NULL; + pNavi_toshow = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_toshow == NULL, "get navi in use failed"); + + ap->mf_Status.more = ap->mf_Status.preMore; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + if (ap->mf_FileOperation.file_name_suffix != NULL) { + SAFE_FREE_CHAR(ap->mf_FileOperation.file_name_suffix); + } + if (ap->mf_FileOperation.to_rename) { + SAFE_FREE_GSTRING(ap->mf_FileOperation.to_rename); + } + if (ap->mf_FileOperation.rename_item) { + elm_genlist_item_flip_set(ap->mf_FileOperation.rename_item, EINA_FALSE); + elm_genlist_item_select_mode_set(ap->mf_FileOperation.rename_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + elm_genlist_item_update(ap->mf_FileOperation.rename_item); + ap->mf_FileOperation.rename_item = NULL; + } + + if (ap->mf_MainWindow.pEntry) { + ap->mf_MainWindow.pEntry = NULL; + } + + if (ap->mf_Status.preMore == MORE_DEFAULT) { + mf_navi_bar_set_upper_item_disable(ap, FALSE); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_DEFAULT_ALL, FALSE); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_DEFAULT_ALL, FALSE); + } else { + int count_dir = 0; + int count_file = 0; + ap->mf_Status.flagFolderSelect = FALSE; + ap->mf_Status.flagFileSelect = FALSE; + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + Evas_Object *pGenlist = ap->mf_MainWindow.pEditView.pGenlist; + mf_genlist_genlist_item_select(ap, pGenlist, &count_file, &count_dir); + + } else { + Evas_Object *pGengrid = ap->mf_MainWindow.pEditView.pGengrid; + mf_gengrid_item_select(ap, pGengrid, &count_file, &count_dir); + } + + if (ap->mf_Status.flagFolderSelect) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, true); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_USER_FOLDER_SEL, false); + } else if (ap->mf_Status.flagFileSelect){ + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, false); + } else { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, true); + } + } + MF_TRACE_END; +} + + +/****************************** +** Prototype : mf_callback_rename_save_cb +** Description : +** Input : void *ad +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_rename_save_cb(void *ad, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)ad; + mf_retm_if(ap == NULL, "ap is NULL"); + + char *name = NULL; + Evas_Object *pEntry = NULL; + const char *entry_data = NULL; + int ret = MYFILE_ERR_NONE; + const char *message = NULL; + GString *from = NULL; + GString *to = NULL; + char *pFullPath = NULL; + char *pName = NULL; + if (ap->mf_Status.more != MORE_RENAME && ap->mf_Status.more != MORE_THUMBNAIL_RENAME) { + MF_TRACE_END; + return; + } + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + MF_TRACE_END; + return; + } + + pEntry = ap->mf_MainWindow.pEntry; + if (pEntry == NULL && ap->mf_Status.more == MORE_RENAME) { + mf_callback_destory_rename(ap); + MF_TRACE_END; + return; + } + entry_data = elm_entry_entry_get(pEntry); + if (entry_data) { + name = elm_entry_markup_to_utf8(entry_data); + if (name == NULL) { + message = GET_STR(MF_RENAME_MSG_GET_NAME_FAILED); + goto INVAILD_NAME_EXIT; + } + if (strlen(name) == 0 && ap->mf_Status.more == MORE_THUMBNAIL_RENAME) + { + SAFE_FREE_CHAR(name); + message = GET_STR(MF_MSG_GET_NAME_FAILED); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + GET_SYS_STR(MF_BUTTON_LABEL_YES), GET_SYS_STR(MF_BUTTON_LABEL_NO), NULL, + mf_callback_illegal_char_popup_cb, ap); + return; + } + } else { + message = GET_STR(MF_RENAME_MSG_GET_NAME_FAILED); + goto INVAILD_NAME_EXIT; + } + + if (strlen(name)) { + + if (ap->mf_FileOperation.file_name_suffix != NULL && strlen(ap->mf_FileOperation.file_name_suffix) > 0) { + pName = g_strconcat(name, ".", ap->mf_FileOperation.file_name_suffix, NULL); + CHAR_CHECK_NULL_GOTO(pName, ALLOC_FAILED_EXIT); + } else { + pName = g_strdup(name); + CHAR_CHECK_NULL_GOTO(pName, ALLOC_FAILED_EXIT); + } + + GString *parent_path = mf_fm_svc_wrapper_get_file_parent_path(ap->mf_FileOperation.to_rename); + GSTRING_CHECK_NULL_GOTO(parent_path, ALLOC_FAILED_EXIT); + pFullPath = g_strconcat(parent_path->str, "/", pName, NULL); + CHAR_CHECK_NULL_GOTO(pFullPath, ALLOC_FAILED_EXIT); + SAFE_FREE_GSTRING(parent_path); + + switch (mf_util_is_valid_name_check(pName)) { + + case MF_INTERNAL_FILE_NAME_EMPTY: + case MF_INTERNAL_FILE_NAME_IGNORE: + message = GET_STR(MF_MSG_SET_NAME_DOT); + goto INVAILD_NAME_EXIT; + case MF_INTERNAL_FILE_NAME_CHUG: + message = GET_STR(MF_MSG_SET_NAME_ALL_SPACE); + goto INVAILD_NAME_EXIT; + case MF_INTERNAL_FILE_NAME_MAX_LENGTH: + message = GET_STR(MF_MSG_NAME_REACH_MAX_LEN); + goto INVAILD_NAME_EXIT; + case MF_INTERNAL_FILE_NAME_INVALID_CHAR: + message = GET_STR(MF_MSG_ILLEGAL_CHAR); + goto INVAILD_NAME_EXIT; + case MF_INTERNAL_FILE_NAME_NULL: + message = GET_STR(MF_MSG_NO_NAME_WARNING); + goto INVAILD_NAME_EXIT; + default: + break; + } + + + if (strlen(pFullPath) > MYFILE_FILE_PATH_LEN_MAX) { + message = GET_STR(MF_MSG_PATH_REACH_MAX_LEN); + goto INVAILD_NAME_EXIT; + } + + from = g_string_new(ap->mf_FileOperation.to_rename->str); + GSTRING_CHECK_NULL_GOTO(from, ALLOC_FAILED_EXIT); + to = g_string_new(pFullPath); + GSTRING_CHECK_NULL_GOTO(from, ALLOC_FAILED_EXIT); + + if (!g_string_equal(from, to)) { + ret = mf_fm_svc_wrapper_rename_service(ap, from, to); + if (ret != MYFILE_ERR_NONE) { + if (errno == EROFS) { + message = GET_STR(MF_MSG_OPER_READ_ONLY); + goto INVAILD_NAME_EXIT; + } else if (ret == MYFILE_ERR_INVALID_DIR_NAME || ret == MYFILE_ERR_INVALID_FILE_NAME) { + message = GET_STR(MF_MSG_ILLEGAL_CHAR); + goto INVAILD_NAME_EXIT; + } else if (ret == MYFILE_ERR_DUPLICATED_NAME) { + message = GET_STR(MF_RENAME_MSG_DUP_NAME); + goto INVAILD_NAME_EXIT; + } else { + message = GET_STR(MF_MSG_UNKNOW_REASON_RENAME_FAILED); + goto INVAILD_NAME_EXIT; + } + } else { + if (ap->mf_Status.more == MORE_RENAME) + __mf_callback_refresh_rename(ap, from, to); + else if (ap->mf_Status.more == MORE_THUMBNAIL_RENAME){ +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_reset_panes_main(ap); + } +#endif + ap->mf_Status.more = MORE_DEFAULT; + ap->mf_Status.preMore = MORE_THUMBNAIL_RENAME; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + evas_object_del(ap->mf_MainWindow.pEntry); + ap->mf_MainWindow.pEntry = NULL; + mf_widget_imf_hide_callback_del(ap->mf_MainWindow.pConformant); + if (ap->mf_Status.view_type == mf_view_root_category) { + mf_util_update_item_from_list_by_name(&ap->mf_FileOperation.category_list, from->str, to->str); + } + + mf_widget_refresh_view(ap); + ap->mf_Status.preMore = MORE_DEFAULT; + } + goto NORMAL_EXIT; + } + } else { + + if (ap->mf_Status.more == MORE_RENAME) + mf_callback_destory_rename(ap); + else if (ap->mf_Status.more == MORE_THUMBNAIL_RENAME){ + mf_callback_cancel_cb(ap, NULL, NULL); + } + goto NORMAL_EXIT; + } + }else { + mf_callback_destory_rename(ap); + goto NORMAL_EXIT; + } +NORMAL_EXIT: + SAFE_FREE_CHAR(name); + SAFE_FREE_CHAR(pName); + SAFE_FREE_CHAR(pFullPath); + SAFE_FREE_GSTRING(from); + SAFE_FREE_GSTRING(to); + MF_TRACE_END; + return; + +INVAILD_NAME_EXIT: + SAFE_FREE_CHAR(name); + SAFE_FREE_CHAR(pName); + SAFE_FREE_CHAR(pFullPath); + SAFE_FREE_GSTRING(from); + SAFE_FREE_GSTRING(to); + + if (ap->mf_Status.more == MORE_THUMBNAIL_RENAME) + { + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + GET_SYS_STR(MF_BUTTON_LABEL_YES), GET_SYS_STR(MF_BUTTON_LABEL_NO), NULL, + mf_callback_illegal_char_popup_cb, ap); + return; + } else { + mf_callback_destory_rename(ap); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, mf_popup_show_vk_cb, ap); + } + + MF_TRACE_END; + return; + +ALLOC_FAILED_EXIT: + SAFE_FREE_CHAR(name); + SAFE_FREE_CHAR(pName); + SAFE_FREE_CHAR(pFullPath); + SAFE_FREE_GSTRING(from); + mf_util_operation_alloc_failed(ap); + MF_TRACE_END; + return; + +} + + +/****************************** +** Prototype : mf_callback_save_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_save_cb(void *data, Evas_Object *obj, void *event_info) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + int ret = 0; + int noContentFlag = 0; + const char *message = NULL; + const char *left_label = NULL; + const char *right_label = NULL; + + if (ap->mf_Status.more == MORE_RENAME || ap->mf_Status.more == MORE_THUMBNAIL_RENAME) { + mf_callback_rename_save_cb(ap, NULL, NULL); + if (ap->mf_Status.more == MORE_THUMBNAIL_RENAME) { + mf_callback_imf_state_callback_del(ap); + } + } else if (ap->mf_Status.more == MORE_CREATE_FOLDER) { + { + const char *entry_data = NULL; + char *name = NULL; + + /*hide IMF*/ + if (ap->mf_MainWindow.pEntry != NULL) { + Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(ap->mf_MainWindow.pEntry); + if (imf_context != NULL) + ecore_imf_context_hide(imf_context); + } + + entry_data = elm_entry_entry_get(ap->mf_MainWindow.pEntry); + + if (entry_data) { + name = elm_entry_markup_to_utf8(entry_data); + } else { + message = GET_STR(MF_MSG_GET_NAME_FAILED); + left_label = GET_SYS_STR(MF_BUTTON_LABEL_YES); + right_label = GET_SYS_STR(MF_BUTTON_LABEL_NO); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_TWO_BTN, NULL, message, + left_label, right_label, NULL, + mf_callback_illegal_char_popup_cb, ap); + return; + } + + if (name == NULL) + return; + + ret = __mf_callback_ime_mkdir_cb(ap, name); + if (ret == 0) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + ap->mf_Status.more = ap->mf_Status.preMore; + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + evas_object_del(ap->mf_MainWindow.pEntry); + ap->mf_MainWindow.pEntry = NULL; + mf_widget_imf_hide_callback_del(ap->mf_MainWindow.pConformant); + + mf_widget_refresh_view(ap); + mf_callback_imf_state_callback_del(ap); + + if (ap->mf_Status.more == MORE_DEFAULT && noContentFlag) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, false); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_NOCONTENT_VIEW, false); + } + } + + if (name != NULL) { + free(name); + name = NULL; + } + } + } +} + + +void mf_callback_popup_deleted_cb(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_MainWindow.pNormalPopup != NULL) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + } + ap->mf_MainWindow.pNormalPopup = NULL; + +} + +/****************************** +** Prototype : mf_callback_launch_send_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_launch_send_cb(void *data, Evas_Object *obj, void *event_info) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + { + if (ap->mf_FileRecordList.selected_files && mf_util_get_eina_list_len(ap->mf_FileRecordList.selected_files) > 0) { + switch (ap->mf_Status.more) { + case MORE_SENDVIABLUETOOTH: + case MORE_SENDVIAEMAIL: + case MORE_SENDVIAMESSAGE: + mf_share_launch_multi_file(data); + break; + default: + break; + } + } else { + const char *message = GET_SYS_STR(MF_LABEL_NOTHING_SELECTED); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + } + } + ap->mf_Status.more = MORE_SHARE_EDIT; +} + +/****************************** +** Prototype : __mf_callback_idle_launch_send_cb +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_callback_idle_launch_send_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + mf_callback_launch_send_cb(ap, NULL, NULL); + return 0; +} + + +/****************************** +** Prototype : mf_callback_send_view_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_send_response_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_MainWindow.pContextPopup != NULL) { + evas_object_del(ap->mf_MainWindow.pContextPopup); + } + ap->mf_MainWindow.pContextPopup = NULL; + + __mf_callback_idle_launch_send_cb(ap); +} + + +/****************************** +** Prototype : __mf_callback_refresh_list_by +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_callback_refresh_list_by(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + Evas_Object *playout = ap->mf_MainWindow.pNaviLayout; + mf_retvm_if(playout == NULL, 0, "get conformant failed"); + Evas_Object *newContent = NULL; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_split_view_left_genlist_refresh(ap); + } +#endif + + if (ap->mf_Status.flagNoContent != EINA_TRUE) { + newContent = mf_navi_bar_content_create(ap); + mfNaviBarSetContent(ap, playout, newContent); + } + ap->mf_Status.more = MORE_DEFAULT; + return 0; +} + +/****************************** +** Prototype : __mf_callback_list_by_response_cb +** Description : Samsung +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_list_by_response_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_MainWindow.pNormalPopup != NULL) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + } + ap->mf_MainWindow.pNormalPopup = NULL; + + ecore_idler_add((Ecore_Task_Cb) __mf_callback_refresh_list_by, ap); + +} + +/****************************** +** Prototype : mf_callback_list_by_view_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_list_by_view_cb(void *data, Evas_Object * obj, void *event_info) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TITLE_LIST_BTN, GET_STR(LABEL_SORT_BY), + NULL, NULL, NULL, NULL, mf_callback_popup_deleted_cb, ap); +} + +/****************************** +** Prototype : mf_callback_edit_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +#ifdef MYFILE_SPLIT_VIEW +static void __mf_callback_edit_init(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + //ap->mf_MainWindow.pEditView.pBox = NULL; + ap->mf_MainWindow.pEditView.pGenlist = NULL; + ap->mf_MainWindow.pEditView.pGengrid = NULL; + //ap->mf_MainWindow.pEditView.pSelectAllCheckBox = NULL; + //ap->mf_MainWindow.pEditView.pSelectAllLayout = NULL; + //ap->mf_MainWindow.pEditView.pPathInfo = NULL; + //ap->mf_MainWindow.pEditView.pInfoBox = NULL; + ap->mf_MainWindow.pEditView.bSelectAllChecked = FALSE;; + ap->mf_MainWindow.pEditView.iTotalCount = 0; + ap->mf_MainWindow.pEditView.iCheckedCount = 0; + MF_TRACE_END; +} + +#endif + +static void __mf_callback_set_select_all_total_count(void *data) +{ + + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + int folder_len = 0; + int file_len = 0; + + folder_len = eina_list_count(ap->mf_FileOperation.folder_list); + file_len = eina_list_count(ap->mf_FileOperation.file_list); + if (ap->mf_Status.more == MORE_EDIT) { + ap->mf_MainWindow.pEditView.iTotalCount = (folder_len + file_len); + } else if (ap->mf_Status.more == MORE_SHARE_EDIT) { + ap->mf_MainWindow.pEditView.iTotalCount = file_len; + } +} + +static void __mf_callback_save_edit_view_status(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + myfileNaviBar *pNavi_s = NULL; + Eina_List *l = NULL; + void *item = NULL; + /*backup the edit point for every navigation bar to get recovery */ + EINA_LIST_FOREACH(ap->mf_MainWindow.plistNaviBar, l, item) { + pNavi_s = (myfileNaviBar *) item; + if(pNavi_s == NULL) + continue; + + if (pNavi_s->pre_operation.path != NULL) + g_string_free(pNavi_s->pre_operation.path, TRUE); + pNavi_s->pre_operation.path = g_string_new(pNavi_s->pCurrentPath); + + if (pNavi_s->naviFlagInUse == TRUE) { + pNavi_s->naviFlagEditStart = TRUE; + } else { + pNavi_s->naviFlagEditStart = FALSE; + } + } + ap->mf_Status.preViewType = ap->mf_Status.view_type; + + MF_TRACE_END; +} + + +void mf_callback_edit_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(MF_LABEL_EDIT)) == 0 ) { + ap->mf_Status.more = MORE_EDIT; + + } else if (g_strcmp0(label, GET_SYS_STR(LABEL_SHARE)) == 0 ) { + ap->mf_Status.more = MORE_SHARE_EDIT; + } else { + return; + } + + + mf_callback_remove_dir_watch(); +#ifdef MYFILE_SPLIT_VIEW + __mf_callback_edit_init(ap); +#endif + /*backup the edit point for every navigation bar to get recovery */ + __mf_callback_save_edit_view_status(ap); +#ifdef MYFILE_USB_OTG + /* if start from OTG, set node editstart flag */ + if (mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str)== MYFILE_OTG) { + char *dev_in_use = mf_otg_get_node_in_use(ap); + mf_otg_set_node_editstart_flag(ap, dev_in_use, TRUE); + } +#endif + + mf_navi_bar_create_edit_view(ap); + + mf_navi_bar_edit_list_update(ap); + + __mf_callback_set_select_all_total_count(ap); + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_FALSE; + //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked); + + /*disable all the tab item if tab exists */ + MF_TRACE_END; +} + + +/****************************** +** Prototype : mf_callback_icu_update_cb +** Description : +** Input : void *data +** Output : int +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2011/06/30 +** Author : Samsung +** Modification : Created function +**/ +void mf_callback_icu_update_cb(void *data) +{ + ug_send_event(UG_EVENT_REGION_CHANGE); + + mf_debug("region changed"); + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.flagIcuInit == FALSE) + return; + /* finalize the previous icu session */ + mf_util_icu_finalize(ap); + /* start a new icu session*/ + mf_util_icu_init(ap); + /* check if we should refresh the list */ + int iSortTypeValue = 0; + mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + if (iSortTypeValue != MYFILE_SORT_BY_DATE_R2O && iSortTypeValue != MYFILE_SORT_BY_DATE_O2R) { + return ; + } + + if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE) + return ; + + myfileNaviBar *pNaviInUse = mf_navi_bar_get_in_use(ap); + if (pNaviInUse == NULL || ap->mf_MainWindow.pNaviLayout == NULL) + return ; + + /*get current genlist */ + Evas_Object *currgenlist = ap->mf_MainWindow.pNaviGenlist; + if (currgenlist == NULL) + return ; + + evas_object_del(currgenlist); + /*create new genlist */ + Evas_Object *newgenlist = mf_navi_bar_content_create(ap); + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, newgenlist); + + return ; +} + + +/****************************** +** Prototype : mf_callback_new_folder_create_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_new_folder_create_cb(void *data, Evas_Object * obj, void *event_info) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + if (ap->mf_Status.more == MORE_CREATE_FOLDER) + return; + { + int ret = 0; + if (ap->mf_Status.folder_count >= MAX_FOLDER_COUNT) { + const char *message = GET_STR(MF_MSG_FOLDER_NUM_MAX); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + return; + } + ap->mf_Status.preMore = ap->mf_Status.more; + ap->mf_Status.more = MORE_CREATE_FOLDER; + + ret = mf_util_check_disk_space(ap); + if (ret == MYFILE_ERR_NO_FREE_SPACE) { + ap->mf_Status.more = MORE_DEFAULT; + return; + } + + mf_navi_bar_create_new_folder_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + +} + + +void mf_callback_rename_create_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + mfItemData_s *params = (mfItemData_s *) data; + struct appdata *ap = (struct appdata *)params->ap; + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + if (ap->mf_Status.more == MORE_THUMBNAIL_RENAME) + return; + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "sel_contents"); + + SAFE_FREE_OBJ(ap->mf_MainWindow.pLabelLayout); + int ret = 0; + + ap->mf_Status.preMore = ap->mf_Status.more; + ap->mf_Status.more = MORE_THUMBNAIL_RENAME; + + ret = mf_util_check_disk_space(ap); + + mf_navi_bar_create_rename_view(params); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + MF_TRACE_END; + +} + +void mf_callback_max_len_reached_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + mf_popup_indicator_popup(ap, mf_util_get_text(MF_LABEL_MAX_CHARACTER_REACHED)); + MF_TRACE_END; +} + + + + +/****************************** +** Prototype : mf_callback_init_operation_cancel +** Description : Samsung +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_init_operation_cancel(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (ap->mf_FileOperation.pCancel) { + mf_cancel_free(ap->mf_FileOperation.pCancel); + ap->mf_FileOperation.pCancel = NULL; + } + + ap->mf_FileOperation.pCancel = mf_cancel_new(); + MF_TRACE_END; +} + +/****************************** +** Prototype : __mf_callback_idle_refresh +** Description : Samsung +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_callback_idle_refresh(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, 0, "ap is NULL"); + mf_util_refresh_screen(ap); + + MF_TRACE_END; + return ECORE_CALLBACK_CANCEL; +} + + +/****************************** +** Prototype : __mf_callback_progress_bar_state_cb +** Description : Samsung +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_callback_progress_bar_state_cb(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_fo_msg *msg = ap->mf_FileOperation.pMessage; + char lable[10] = { '\0', }; + double value = 0.0; + char count_label[10] = { '\0' }; + int count = 0; + int total_count = 0; + Evas_Object *layout = ap->mf_MainWindow.pProgressLayout; + mf_retm_if(layout == NULL, "layout is NULL"); + + value = (double)msg->current_size / msg->total_size; + elm_progressbar_value_set(ap->mf_FileOperation.progress_bar, value); + + snprintf(lable, sizeof(lable), "%d%s", (int)(value * 100), "%"); + + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.text.left", lable); + + + total_count = ap->mf_FileOperation.iTotalCount; + count = msg->current_index; + + if (count <= total_count) { + snprintf(count_label, sizeof(count_label), "%d/%d", count, total_count); + } + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.text.right", count_label); + + MF_TRACE_END; +} + + + +/****************************** +** Prototype : mf_callback_progress_bar_cancel_cb +** Description : Samsung +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_progress_bar_cancel_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_cancel_do_cancel(ap->mf_FileOperation.pCancel); + mf_msg_request_handled_send(); + + MF_TRACE_END; +} + + +/****************************** +** Prototype : mfCopyCB +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_copy_move_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + mf_retm_if(event_info == NULL, "event_info is NULL"); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + const char *label = elm_object_item_text_get(item); + + printf("label is [%s]\n", label); + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + if (label) { + ap->mf_Status.flagFolderSelect = FALSE; + ap->mf_Status.flagFileSelect = FALSE; + + if (ap->mf_FileRecordList.value_saver != NULL) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.value_saver, MYFILE_TYPE_GSTRING); + ap->mf_FileRecordList.value_saver = NULL; + } + ap->mf_FileRecordList.value_saver = mf_util_get_all_selected(ap); + + if (mf_util_get_eina_list_len(ap->mf_FileRecordList.value_saver) < 1) { + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_BTN, NULL, GET_SYS_STR(MF_LABEL_NOTHING_SELECTED), + GET_SYS_STR(MF_BUTTON_LABEL_OK), NULL, NULL, mf_callback_warning_popup_cb, ap); + return; + } + + if (ap->mf_FileOperation.source != NULL) { + g_string_free(ap->mf_FileOperation.source, TRUE); + ap->mf_FileOperation.source = NULL; + } + ap->mf_FileOperation.source = g_string_new(ap->mf_Status.path->str); + if (g_strcmp0(label, GET_SYS_STR(LABEL_MOVE)) == 0) { + ap->mf_Status.more = MORE_INTERNAL_MOVE; + } else if (g_strcmp0(label, GET_SYS_STR(LABEL_COPY)) == 0) { + ap->mf_Status.more = MORE_INTERNAL_COPY; + } else { + return; + } + + if (ap->mf_MainWindow.pLabelLayout) { + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "sel_contents"); + if (ap->mf_MainWindow.pLabelLayout) + evas_object_del(ap->mf_MainWindow.pLabelLayout); + ap->mf_MainWindow.pLabelLayout = NULL; + } + /*pop select view*/ + /*set Navigation Bar for Destination selection */ + ap->mf_Status.view_type = mf_view_root; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_split_view_unset_right_content(ap); + mf_widget_unset_main_layout_content(ap->mf_MainWindow.pMainLayout); + mf_split_view_hide(ap); + evas_object_show(ap->mf_MainWindow.pMainLayout); + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); + } +#endif + mf_widget_refresh_view(ap); + } + MF_TRACE_END; +} + + +/****************************** +** Prototype : mf_callback_paste_here_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_paste_here_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + int source_len = 0; + int dest_len = 0; + GList *pSourceList = NULL; + int count = 0; + gchar *pDestPath = NULL; + + mf_retm_if(ap->mf_FileOperation.source == NULL, "ap->mf_FileOperation.source is NULL"); + mf_retm_if(ap->mf_FileOperation.source->str == NULL, "ap->mf_FileOperation.source is NULL"); + + mf_retm_if(ap->mf_Status.path == NULL, "ap->mf_Status.path is NULL"); + mf_retm_if(ap->mf_Status.path->str == NULL, "ap->mf_Status.path->str is NULL"); + + ap->mf_Status.more = MORE_DATA_COPYING; + ap->mf_FileOperation.destination = ap->mf_Status.path; + + if (ap->mf_FileOperation.source && ap->mf_FileOperation.source->str) { + source_len = strlen(ap->mf_FileOperation.source->str); + } + + if (ap->mf_FileOperation.destination && ap->mf_FileOperation.destination->str) { + dest_len = strlen(ap->mf_FileOperation.destination->str); + } + + if (source_len == 0 || dest_len == 0) { + MF_TRACE_END; + return; + } + /*glib api change */ + + if (!mf_util_check_forbidden_operation(ap)) { + return; + } + if (source_len == dest_len && strcmp(ap->mf_FileOperation.destination->str, ap->mf_FileOperation.source->str) == 0) { + ap->mf_FileOperation.refresh_type = TRUE; + } else { + ap->mf_FileOperation.refresh_type = FALSE; + } + + mf_util_merge_eina_list_to_glist(ap->mf_FileRecordList.value_saver, &pSourceList); + + if (pSourceList) { + count = g_list_length(pSourceList); + } else { + MF_TRACE_END; + return; + } + + ap->mf_FileOperation.iTotalCount = count; + pDestPath = g_strdup(ap->mf_Status.path->str); + if (pDestPath == NULL) { + g_list_free(pSourceList); + pSourceList = NULL; + MF_TRACE_END; + return; + } + + mf_callback_init_operation_cancel(ap); + ap->mf_FileOperation.iRequestType = MF_REQ_NONE; + + ap->mf_FileOperation.pSourceList = pSourceList; + + if (mf_copy_copy_items(pSourceList, pDestPath, ap->mf_FileOperation.pCancel, TRUE, ap) == 0) { + ap->mf_FileOperation.iOperationSuccessFlag = TRUE; + mf_callback_remove_dir_watch(); + ap->mf_MainWindow.pProgressPopup = mf_popup_create_pb_popup(ap, GET_SYS_STR(MF_MSG_COPYING), count, mf_callback_progress_bar_cancel_cb, ap); + } else { + mf_util_exception_func(ap); + } + + g_free(pDestPath); + pDestPath = NULL; + + MF_TRACE_END; +} + + +/****************************** +** Prototype : mf_move_here_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_move_here_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + int source_len = 0; + int dest_len = 0; + GList *pSourceList = NULL; + int count = 0; + gchar *pDestPath = NULL; + + mf_retm_if(ap->mf_FileOperation.source == NULL, "ap->mf_FileOperation.source is NULL"); + mf_retm_if(ap->mf_FileOperation.source->str == NULL, "ap->mf_FileOperation.source is NULL"); + + mf_retm_if(ap->mf_Status.path == NULL, "ap->mf_Status.path is NULL"); + mf_retm_if(ap->mf_Status.path->str == NULL, "ap->mf_Status.path->str is NULL"); + ap->mf_Status.more = MORE_DATA_MOVING; + + ap->mf_FileOperation.destination = ap->mf_Status.path; + + if (ap->mf_FileOperation.source && ap->mf_FileOperation.source->str) { + source_len = strlen(ap->mf_FileOperation.source->str); + } + + if (ap->mf_FileOperation.destination && ap->mf_FileOperation.destination->str) { + dest_len = strlen(ap->mf_FileOperation.destination->str); + } + + if (source_len == 0 || dest_len == 0) { + MF_TRACE_END; + return; + } + /*glib api change */ + if (!mf_util_check_forbidden_operation(ap)) { + return; + } else { + ap->mf_FileOperation.refresh_type = FALSE; + } + + mf_util_merge_eina_list_to_glist(ap->mf_FileRecordList.value_saver, &pSourceList); + + if (pSourceList) { + count = g_list_length(pSourceList); + } else { + MF_TRACE_END; + return; + } + + ap->mf_FileOperation.iTotalCount = count; + pDestPath = g_strdup(ap->mf_Status.path->str); + if (pDestPath == NULL) { + g_list_free(pSourceList); + pSourceList = NULL; + MF_TRACE_END; + return; + } + + mf_callback_init_operation_cancel(ap); + ap->mf_FileOperation.iRequestType = MF_REQ_NONE; + + ap->mf_FileOperation.pSourceList = pSourceList; + if (mf_move_move_items(pSourceList, pDestPath, ap->mf_FileOperation.pCancel, true, ap) == 0) { + ap->mf_FileOperation.iOperationSuccessFlag = TRUE; + mf_callback_remove_dir_watch(); + ap->mf_MainWindow.pProgressPopup = mf_popup_create_pb_popup(ap, GET_SYS_STR(MF_MSG_MOVING), count, mf_callback_progress_bar_cancel_cb, ap); + } else { + mf_util_exception_func(ap); + } + g_free(pDestPath); + pDestPath = NULL; +} + +/****************************** +** Prototype : __mf_callback_confirm_delete +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_callback_confirm_delete(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(LABEL_CANCEL)) == 0 ) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + return; + } else if (g_strcmp0(label, GET_SYS_STR(LABEL_DELETE)) == 0) { + if (ap->mf_MainWindow.pNormalPopup) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + } + + if (ap->mf_MainWindow.pLabelLayout) { + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "sel_contents"); + if (ap->mf_MainWindow.pLabelLayout) + evas_object_del(ap->mf_MainWindow.pLabelLayout); + ap->mf_MainWindow.pLabelLayout = NULL; + } + + ap->mf_FileOperation.refresh_type = TRUE; + + /*setting item check */ + Eina_List *selected_list = mf_util_get_all_selected(ap); + + if (ap->mf_FileRecordList.value_saver != NULL) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.value_saver, MYFILE_TYPE_GSTRING); + ap->mf_FileRecordList.value_saver = NULL; + } + ap->mf_FileRecordList.value_saver = selected_list; + + if (mf_util_get_eina_list_len(ap->mf_FileRecordList.value_saver) < 1) { + ap->mf_MainWindow.pNormalPopup = + mf_popup_create_popup(ap, POPMODE_TEXT_BTN, NULL, GET_SYS_STR(MF_LABEL_NOTHING_SELECTED), + GET_SYS_STR(MF_BUTTON_LABEL_OK), NULL, NULL, mf_callback_warning_popup_cb, ap); + } else { + GList *pSourceList = NULL; + int count = 0; + + mf_util_merge_eina_list_to_glist(ap->mf_FileRecordList.value_saver, &pSourceList); + if (pSourceList) { + count = g_list_length(pSourceList); + } else { + MF_TRACE_END; + return; + } + + ap->mf_FileOperation.iTotalCount = count; + mf_callback_init_operation_cancel(ap); + ap->mf_Status.more = MORE_DELETE; + ap->mf_FileOperation.iRequestType = MF_REQ_NONE; + + ap->mf_FileOperation.pSourceList = pSourceList; + mf_callback_remove_dir_watch(); + + if (mf_delete_items(pSourceList, ap->mf_FileOperation.pCancel, TRUE, ap) == 0) { + ap->mf_FileOperation.iOperationSuccessFlag = TRUE; + mf_callback_remove_dir_watch(); + ap->mf_MainWindow.pProgressPopup = + mf_popup_create_pb_popup(ap, GET_SYS_STR(MF_MSG_DELETING), count, mf_callback_progress_bar_cancel_cb, ap); + } else { + mf_util_exception_func(ap); + } + } + } +} + +/****************************** +** Prototype : mf_callback_delete_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_delete_cb(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + mf_debug("delete clicked\n"); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TITLE_TEXT_TWO_BTN, + NULL, + GET_SYS_STR(MF_BUTTON_LABEL_DEL), + GET_SYS_STR(LABEL_DELETE), GET_SYS_STR(LABEL_CANCEL), NULL, __mf_callback_confirm_delete, ap); +} + + +/****************************** +** Prototype : mf_callback_thread_pipe_cb +** Description : +** Input : void *data +** void *buffer +** unsigned int nbyte +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_operation_request_rename_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_fo_request *request = ap->mf_FileOperation.pRequest; + + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_show(ap->mf_MainWindow.pProgressPopup); + } + + ap->mf_FileOperation.iRequestType = MF_REQ_RENAME; + mf_request_set_result(request, MF_REQ_RENAME); + MF_TRACE_END; + +} + +void mf_callback_operation_request_replace_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_fo_request *request = ap->mf_FileOperation.pRequest; + + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_show(ap->mf_MainWindow.pProgressPopup); + } + + ap->mf_FileOperation.iRequestType = MF_REQ_MERGE; + if (ap->mf_FileOperation.refresh_type == TRUE) { + mf_request_set_result(request, MF_REQ_SKIP); + } else { + mf_request_set_result(request, MF_REQ_MERGE); + } + MF_TRACE_END; + +} + +void mf_callback_operation_request_cancel_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_fo_request *request = ap->mf_FileOperation.pRequest; + + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_show(ap->mf_MainWindow.pProgressPopup); + } + + mf_request_set_result(request, MF_REQ_CANCEL); + MF_TRACE_END; + +} + + +void mf_callback_thread_pipe_cb(void *data, void *buffer, unsigned int nbyte) +{ + MF_TRACE_BEGIN; + mf_debug(":::::::::: Main thread id = %d ::::::::::", (int)pthread_self()); + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + mf_fo_msg *pPipeMsg = (mf_fo_msg *) buffer; + char *message = NULL; + int error_type = 0; + + if (!MYFILE_MAGIC_CHECK(pPipeMsg, MYFILE_MAGIC_PIPE_DATA)) { + mf_error(":::::::::::::p_pipe_data ERROR:::::::::::::"); + return; + } + ap->mf_FileOperation.pMessage = pPipeMsg; + ap->mf_FileOperation.pRequest = pPipeMsg->request; + ap->mf_FileOperation.sync_pipe = pPipeMsg->pipe; + mf_debug("::::::::::: pPipeMsg->msg_type is [%d]", pPipeMsg->msg_type); + + mf_util_set_pm_lock(ap, EINA_TRUE); + switch (pPipeMsg->msg_type) { + case MF_MSG_NONE: + case MF_MSG_SKIP: + case MF_MSG_SYNC: + mf_msg_request_handled_send(); + break; + case MF_MSG_CANCELLED: + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_del(ap->mf_MainWindow.pProgressPopup); + ap->mf_MainWindow.pProgressPopup = NULL; + } + ap->mf_MainWindow.pFinishPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "Canceling...", NULL, NULL, NULL, NULL, NULL); + mf_msg_request_handled_send(); + ap->mf_FileOperation.iOperationSuccessFlag = FALSE; + break; + case MF_MSG_DOING: + if (ap->mf_Status.view_type == mf_view_root_category && (ap->mf_Status.more == MORE_DELETE || ap->mf_Status.more == MORE_IDLE_DELETE)) { + mf_util_remove_item_from_list_by_name(&ap->mf_FileOperation.category_list, pPipeMsg->current_real); + } + __mf_callback_progress_bar_state_cb(ap); + mf_msg_request_handled_send(); + break; + case MF_MSG_REQUEST: + if (ap->mf_FileOperation.iRequestType == MF_REQ_RENAME) { + mf_request_set_result(pPipeMsg->request, MF_REQ_RENAME); + + } else if (ap->mf_FileOperation.iRequestType == MF_REQ_MERGE) { + if (ap->mf_FileOperation.refresh_type == TRUE) { + mf_request_set_result(pPipeMsg->request, MF_REQ_SKIP); + } else { + mf_request_set_result(pPipeMsg->request, MF_REQ_MERGE); + } + } else { + ap->mf_FileOperation.iRequestType = MF_REQ_RENAME; + mf_request_set_result(pPipeMsg->request, MF_REQ_RENAME); + } + break; + case MF_MSG_ERROR: + error_type = FO_ERROR_CHECK(pPipeMsg->error_code); + switch (error_type) { + case MF_FO_ERR_PERMISSION: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_PERMISSION_ERR), NULL); + break; + case MF_FO_ERR_ARGUMENT: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_ARG_ERR), NULL); + break; + case MF_FO_ERR_FAULT: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_FAULT_ERR), NULL); + break; + case MF_FO_ERR_TYPE: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_FILE_TYPE_ERR), NULL); + break; + case MF_FO_ERR_MAX_OPEN: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_MAX_OPEN_ERR), NULL); + break; + case MF_FO_ERR_SPACE: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_NO_SPACE), NULL); + break; + case MF_FO_ERR_RO: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_RO_ERR), NULL); + break; + case MF_FO_ERR_LOOP: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_LOOP_ERR), NULL); + break; + case MF_FO_ERR_MEM: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_MEM_ERR), NULL); + break; + case MF_FO_ERR_NOT_EXIST: + message = g_strconcat("Operation failed
    ", GET_SYS_STR(MF_LABEL_FILE_NOT_EXIST), NULL); + break; + case MF_FO_ERR_LONG_NAME: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_LONG_NAME_ERR), NULL); + break; + case MF_FO_ERR_BIG_SIZE: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_BIG_SIZE_ERR), NULL); + break; + case MF_FO_ERR_UNKNOWN: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_UNKNOWN_ERR), NULL); + break; + case MF_FO_ERR_IO: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_IO_ERR), NULL); + break; + default: + message = g_strconcat("Operation failed
    ", GET_STR(MF_MSG_DEFAULT_ERR), NULL); + break; + } + + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_del(ap->mf_MainWindow.pProgressPopup); + ap->mf_MainWindow.pProgressPopup = NULL; + } + + if (ap->mf_MainWindow.pFinishPopup) { + evas_object_del(ap->mf_MainWindow.pFinishPopup); + ap->mf_MainWindow.pFinishPopup = NULL; + } + + SAFE_FREE_CHAR(ap->mf_FileOperation.pOperationMsg); + if (error_type == MF_FO_ERR_SPACE) { + ap->mf_FileOperation.pOperationMsg = message; + } else { + if (ap->mf_Status.more == MORE_DATA_COPYING) { + ap->mf_FileOperation.pOperationMsg = g_strdup(GET_STR(MF_MSG_COPY_FAILED)); + } else if (ap->mf_Status.more == MORE_DATA_MOVING) { + ap->mf_FileOperation.pOperationMsg = g_strdup(GET_SYS_STR(MF_MSG_MOVE_FAILED)); + } else if (ap->mf_Status.more == MORE_DELETE || ap->mf_Status.more == MORE_IDLE_DELETE) { + ap->mf_FileOperation.pOperationMsg = g_strdup(GET_SYS_STR(MF_LABEL_DELETE_FAILED)); + } else { + ap->mf_FileOperation.pOperationMsg = message; + } + } + + + ap->mf_FileOperation.pGenlistItem = NULL; + ap->mf_FileOperation.iOperationSuccessFlag = FALSE; + mf_msg_request_handled_send(); + break; + case MF_MSG_END: + if (ap->mf_FileOperation.source) { + g_string_free(ap->mf_FileOperation.source, TRUE); + ap->mf_FileOperation.source = NULL; + } + if (ap->mf_FileOperation.pSourceList) { + g_list_free(ap->mf_FileOperation.pSourceList); + ap->mf_FileOperation.pSourceList = NULL; + } + if (ap->mf_MainWindow.pProgressPopup) { + evas_object_del(ap->mf_MainWindow.pProgressPopup); + ap->mf_MainWindow.pProgressPopup = NULL; + } + ecore_idler_add((Ecore_Task_Cb)__mf_callback_idle_refresh, ap); + if (pPipeMsg->pipe) { + ecore_pipe_del(pPipeMsg->pipe); + pPipeMsg->pipe = NULL; + } + mf_msg_request_handled_send(); + + mf_util_set_pm_lock(ap, EINA_FALSE); + if (ap->mf_FileRecordList.value_saver != NULL) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.value_saver, MYFILE_TYPE_GSTRING); + ap->mf_FileRecordList.value_saver = NULL; + } + break; + default: + mf_msg_request_handled_send(); + break; + } + +} + + +void mf_callback_exception_popup_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (ap->mf_MainWindow.pNormalPopup) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + } + + mf_callback_cancel_cb(ap, NULL, NULL); +} + +/****** Memory card connection/removal handler ******/ +static void __mf_callback_mmc_connected(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + + Evas_Object *entry = NULL; + ap->mf_Status.iStorageState |= MYFILE_MMC; + + if (ap->mf_Status.more == MORE_CREATE_FOLDER || ap->mf_Status.more == MORE_SEARCH || (ap->mf_Status.more == MORE_RENAME && ap->mf_Status.preMore == MORE_SEARCH)) + return; + + if (ap->mf_Status.view_type != mf_view_root) { + return; + } + + mf_util_action_storage_insert(ap, GET_SYS_STR(MF_LABEL_MMC)); + if (ap->mf_Status.more == MORE_RENAME) { + entry = ap->mf_MainWindow.pEntry; + if (entry != NULL) { + elm_object_focus_set(entry, EINA_TRUE); + } + } + mf_navi_bar_title_set(ap); + +} + +void mf_callback_storage_remove_view_operation(void *data, int optStorage) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + + Evas_Object *parent = NULL; + const char *labelStorage = NULL; + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + parent = ap->mf_MainWindow.pNaviGenlist; + } else { + parent = ap->mf_MainWindow.pNaviGengrid; + } + switch (optStorage) { + case MYFILE_PHONE: + labelStorage = PHONE_FOLDER; + break; + case MYFILE_MMC: + labelStorage = MEMORY_FOLDER; + break; + case MYFILE_OTG: + labelStorage = OTG_FOLDER; + break; + default: + break; + } + mf_widget_item_remove(parent, labelStorage, ap->mf_Status.flagViewType); +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_OTG) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.otg_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + +} + +void mf_callback_storage_remove_category_view_items(void *data, int optStorage) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + + Evas_Object *parent = NULL; + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + parent = ap->mf_MainWindow.pNaviGenlist; + } else { + parent = ap->mf_MainWindow.pNaviGengrid; + } + mf_widget_items_remove(parent, optStorage, ap->mf_Status.flagViewType); + mf_util_remove_item_from_list_by_location(&ap->mf_FileOperation.category_list, optStorage); +} + +static void __mf_callback_mmc_removed(void *data, MF_STORAGE storage) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + + Evas_Object *entry = NULL; + char *labelStorage = NULL; + MF_STORAGE optStorage = MYFILE_NONE; + myfileNaviBar *pNaviInUseStruct = NULL; + myfileNaviBar *pNaviToShowStruct = NULL; + Evas_Object *pNaviBarStorageView = NULL; + bool bEditStartFlag = FALSE; + + optStorage = storage; + switch (optStorage) { + case MYFILE_PHONE: + labelStorage = GET_SYS_STR(MF_LABEL_PHONE); + break; + case MYFILE_MMC: + labelStorage = GET_SYS_STR(MF_LABEL_MMC); + break; + default: + break; + } + /*1.2.1 check if mmc is editstar navi */ + pNaviBarStorageView = ap->mf_MainWindow.pNaviBar; + + mf_debug("before remove is [%d]", ap->mf_Status.iStorageState); + ap->mf_Status.iStorageState = (ap->mf_Status.iStorageState ^ optStorage); + mf_debug("after remove is [%d]", ap->mf_Status.iStorageState); + + /*3 factors; */ + /* + ** 1. status ap->mf_Status.more + ** 2. is storage in Use ap->mf_Status.path + ** 3. is source path in storage in inter-storage operation flagEditStartView + */ + + if (ap->mf_Status.view_type == mf_view_root) { + if(mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str) != optStorage) { + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + mf_callback_storage_remove_view_operation(ap, optStorage); + break; + case MORE_INTERNAL_COPY_MOVE: + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + pNaviToShowStruct = mf_navi_bar_recover_list(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } else { + mf_callback_storage_remove_view_operation(ap, optStorage); + } + break; + default: + break; + } + }else { + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + mf_callback_storage_remove_view_operation(ap, optStorage); + break; + case MORE_INTERNAL_COPY_MOVE: + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + mf_navi_bar_recover_list(ap); + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); +#ifdef MYFILE_SPLIT_VIEW + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + default: + break; + } + } + } else if (ap->mf_Status.view_type == mf_view_root_category) { + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + case MORE_EDIT: + case MORE_SHARE_EDIT: + case MORE_RENAME: + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + mf_callback_storage_remove_category_view_items(ap, optStorage); + break; + default: + break; + } + } else if(mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str) != optStorage) { + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + case MORE_EDIT: + case MORE_SHARE_EDIT: + case MORE_IDLE_DELETE: + case MORE_DELETE: + case MORE_RENAME: + /* not a inter-storage operation */ + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + + if (ap->mf_Status.more == MORE_RENAME) { + entry = ap->mf_MainWindow.pEntry; + if (entry != NULL) { + elm_object_focus_set(entry, EINA_TRUE); + } + } + break; + case MORE_SEARCH: + case MORE_THUMBNAIL_RENAME: + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + break; + case MORE_CREATE_FOLDER: + if (ap->mf_Status.preMore == MORE_DEFAULT) { + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + break; + } else if (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.preMore == MORE_INTERNAL_COPY + || ap->mf_Status.preMore == MORE_INTERNAL_MOVE) { + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + ap->mf_Status.more = MORE_DEFAULT; + pNaviToShowStruct = mf_navi_bar_recover_list(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } + } + if (bEditStartFlag == TRUE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + } + break; + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + pNaviToShowStruct = mf_navi_bar_recover_list(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } + + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + break; + + case MORE_DATA_COPYING: + case MORE_DATA_MOVING: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + ap->mf_Status.flagStorageRemoved = EINA_TRUE; + + ap->mf_MainWindow.pMmcRemovedPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "Mmc removed...", NULL, NULL, NULL, NULL, NULL); + } else { + ap->mf_Status.flagStorageRemoved = EINA_FALSE; + } + + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + + break; + default: + break; + } + } else { + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + /*set status path && refresh the screen */ + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + case MORE_SEARCH: + case MORE_THUMBNAIL_RENAME: + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + ap->mf_Status.more = MORE_DEFAULT; + ap->mf_Status.preMore = MORE_DEFAULT; + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + + break; + case MORE_EDIT: + case MORE_SHARE_EDIT: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + mf_navi_bar_recover_list(ap); + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + case MORE_IDLE_DELETE: + + ap->mf_MainWindow.pMmcRemovedPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "Mmc removed...", NULL, NULL, NULL, NULL, NULL); + /*ToDo: check whether get the error before this; */ + if (ap->mf_FileOperation.pCancel) { + mf_cancel_do_cancel(ap->mf_FileOperation.pCancel); + } + + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + + ap->mf_Status.flagStorageRemoved = EINA_TRUE; + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + case MORE_RENAME: + if (ap->mf_Status.preMore == MORE_DEFAULT) { + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + } else if (ap->mf_Status.preMore == MORE_EDIT) { + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_recover_list(ap); + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + break; + case MORE_CREATE_FOLDER: + if (ap->mf_MainWindow.pEditField != NULL) { + evas_object_hide(ap->mf_MainWindow.pEditField); + } + if (ap->mf_Status.preMore == MORE_DEFAULT) { + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + } else if (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.preMore == MORE_INTERNAL_COPY + || ap->mf_Status.preMore == MORE_INTERNAL_MOVE) { + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + ap->mf_Status.more = MORE_DEFAULT; + pNaviToShowStruct = mf_navi_bar_recover_list(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } else { + ap->mf_Status.more = ap->mf_Status.preMore; + } + + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + + break; + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + mf_navi_bar_recover_list(ap); + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + + case MORE_DATA_COPYING: + case MORE_DATA_MOVING: + ap->mf_MainWindow.pMmcRemovedPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "Mmc removed...", NULL, NULL, NULL, NULL, NULL); + bEditStartFlag = mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + if (bEditStartFlag == TRUE) { + ap->mf_Status.flagStorageRemoved = EINA_TRUE; + } else { + ap->mf_Status.flagStorageRemoved = EINA_FALSE; + } + + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + /*reset the path for the navigation bar to show*/ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = g_string_new(pNaviInUseStruct->pCurrentPath); + + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + /*check navigation bar count to decide the main layout content*/ + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + break; + case MORE_DELETE: + ap->mf_MainWindow.pMmcRemovedPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "Mmc removed...", NULL, NULL, NULL, NULL, NULL); + if (ap->mf_FileOperation.pCancel) { + mf_cancel_do_cancel(ap->mf_FileOperation.pCancel); + } + mf_navi_bar_remove_list_item_by_label(ap, labelStorage); + pNaviInUseStruct = mf_navi_bar_get_in_use(ap); + + if (ap->mf_Status.iStorageState == MYFILE_PHONE) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + + } else { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (optStorage == MYFILE_MMC) { + elm_object_item_del(ap->mf_MainWindow.sSplitData.mmc_item); + ap->mf_MainWindow.sSplitData.mmc_item = NULL; + } + } +#endif + } + mf_navi_bar_refresh_recovered_view(ap, pNaviInUseStruct); + break; + default: + break; + } + + } + if (ap->mf_MainWindow.pMmcRemovedPopup) { + mf_debug(); + evas_object_del(ap->mf_MainWindow.pMmcRemovedPopup); + ap->mf_MainWindow.pMmcRemovedPopup = NULL; + } + mf_navi_bar_title_set(ap); + +} +static void __mf_callback_storage_changed_cb(keynode_t *key, void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + int optStorage = MYFILE_NONE; + + if (VCONF_TYPE_INT == vconf_keynode_get_type(key) + && VCONFKEY_SYSMAN_MMC_MOUNTED == vconf_keynode_get_int(key)) { + if (!(ap->mf_Status.iStorageState & MYFILE_MMC)) { + __mf_callback_mmc_connected(ap); + } + return; + } + + if (VCONFKEY_SYSMAN_MMC_REMOVED == vconf_keynode_get_int(key) + || VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED == vconf_keynode_get_int(key)) { + mf_debug("mmc removed"); + optStorage = MYFILE_MMC; + ap->mf_Status.flagStorageRemoved = EINA_TRUE; + } + + if (optStorage == MYFILE_NONE) { + mf_debug("get removed storage failed\n"); + return; + } + /*here we handle the remove action */ + if (ap->mf_Status.iStorageState & optStorage) { + __mf_callback_mmc_removed(ap, optStorage); + } + return; +} + + +int mf_callback_set_mmc_state_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + int mmc_state = 0; + mf_retvm_if(ap == NULL, -1, "appdata is NULL"); + + mf_util_is_mmc_on(&mmc_state); + return vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, __mf_callback_storage_changed_cb, ap); +} +/****** end of Memory card connection/removal handler ******/ + +/****** USB otg connection/removal handler ******/ +#ifdef MYFILE_USB_OTG +static void __mf_callback_otg_removal_cb(keynode_t *key, void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + + myfileNaviBar *pNaviStorageStruct = NULL; + Evas_Object *pNaviBarStorageView = NULL; + bool bAllRemovedFlag = FALSE; /*all otg devices are removed*/ + /* first generated the removed node list */ + mf_otg_generate_removed_list(ap); + int count_original = eina_list_count(ap->mf_FileOperation.otg_dev_list); + int count_removed = eina_list_count(ap->mf_FileOperation.otg_dev_removed_list); + if(count_original > count_removed) + bAllRemovedFlag = FALSE; + else + bAllRemovedFlag = TRUE; + /*1.2.1 check if otg is editstar navi */ + char *labelStorage = NULL; + labelStorage = GET_SYS_STR(MF_LABEL_OTG); + + pNaviStorageStruct = mf_navi_bar_get_struct_by_label(ap, labelStorage); + pNaviBarStorageView = ap->mf_MainWindow.pNaviBar; + mf_debug("before remove is [%d]", ap->mf_Status.iStorageState); + if(bAllRemovedFlag == TRUE) + ap->mf_Status.iStorageState = (ap->mf_Status.iStorageState ^ MYFILE_OTG); + + /*3 factors; */ + /* + ** 1. status ap->mf_Status.more + ** 2. is storage in Use ap->mf_Status.path + ** 3. is source path in storage in inter-storage operation flagEditStartView + */ + + + if (bAllRemovedFlag == TRUE) { /*1. otg storage all removed*/ + /*we should check if tab bar need to be removed */ + mf_error(">>>>>>>>>>>>>>>>>>Remove all"); + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_SEARCH: + if (pNaviStorageStruct && pNaviStorageStruct->naviFlagInUse == TRUE) { + if (ap->mf_FileOperation.sync_pipe != NULL) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + + if (ap->mf_Status.search_handler > 0) { + mf_search_stop(ap->mf_Status.search_handler); + } + + if (ap->mf_Status.search_handler > 0) { + mf_search_finalize(&ap->mf_Status.search_handler); + } + + } + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_EDIT: + case MORE_SHARE_EDIT: + mf_debug(); + if (pNaviStorageStruct && pNaviStorageStruct->naviFlagInUse == TRUE) + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_TABBAR_ENABLE | MF_OTG_OPT_THEME_RESET | MF_OTG_OPT_NOR_POPUP_DEL); + else + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_THEME_RESET | MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_IDLE_DELETE: + case MORE_DELETE: + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_RENAME: + case MORE_CREATE_FOLDER: + if (pNaviStorageStruct && (pNaviStorageStruct->naviFlagInUse == TRUE || pNaviStorageStruct->naviFlagEditStart == TRUE)) + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_TABBAR_ENABLE | MF_OTG_OPT_NOR_POPUP_DEL); + else + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_DATA_COPYING: + case MORE_DATA_MOVING: + mf_otg_dev_all_removed_update(ap, MF_OTG_OPT_REQ_POPUP_DEL); + break; + default: + break; + } + } else { /*otg storages part removed*/ + /*we don't need to check tab bar status*/ + mf_error(">>>>>>>>>>>>>>>>>>not all removed"); + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + mf_otg_dev_removed_update(ap, MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_SEARCH: + mf_otg_dev_removed_update(ap, MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_EDIT: + case MORE_SHARE_EDIT: + if (pNaviStorageStruct && pNaviStorageStruct->naviFlagInUse == TRUE) + mf_otg_dev_removed_update(ap, MF_OTG_OPT_TABBAR_ENABLE | MF_OTG_OPT_THEME_RESET | MF_OTG_OPT_NOR_POPUP_DEL); + else + mf_otg_dev_removed_update(ap, MF_OTG_OPT_THEME_RESET | MF_OTG_OPT_NOR_POPUP_DEL); + break; + case MORE_IDLE_DELETE: + case MORE_DELETE: + mf_otg_dev_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_RENAME: + case MORE_CREATE_FOLDER: + if (pNaviStorageStruct && (pNaviStorageStruct->naviFlagInUse == TRUE || pNaviStorageStruct->naviFlagEditStart == TRUE)) + mf_otg_dev_removed_update(ap, MF_OTG_OPT_TABBAR_ENABLE | MF_OTG_OPT_NOR_POPUP_DEL); + else + mf_otg_dev_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + mf_otg_dev_removed_update(ap, MF_OTG_OPT_NONE); + break; + case MORE_DATA_COPYING: + case MORE_DATA_MOVING: + mf_otg_dev_removed_update(ap, MF_OTG_OPT_REQ_POPUP_DEL); + break; + default: + break; + } + } + + + MF_TRACE_END; + mf_debug("after remove is [%d]", ap->mf_Status.iStorageState); +} + + +static void __mf_callback_otg_connected_cb(keynode_t *key, void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + Evas_Object *entry = NULL; + + /* otg-dev-list update */ + mf_debug("before update: [%d]", eina_list_count(ap->mf_FileOperation.otg_dev_list)); + mf_otg_list_update(ap, true); + mf_debug("after update: [%d]", eina_list_count(ap->mf_FileOperation.otg_dev_list)); + /* we have 2 cases: + * 1. otg tab already exists -- update the genlist + * 2. otg tab does not exist -- add tab + */ + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + mf_debug("path is %s", ap->mf_Status.path->str); + if (g_strcmp0(ap->mf_Status.path->str, OTG_FOLDER) == 0) { + mf_debug(); + mf_util_ex_disk_list_update(ap); + mf_debug(); + } + } else { + mf_debug(); + ap->mf_Status.iStorageState |= MYFILE_OTG; + mf_util_action_storage_insert(ap, GET_STR(MF_LABEL_OTG)); + mf_debug(); + } + + mf_debug(); + if (ap->mf_Status.more == MORE_RENAME) { + entry = ap->mf_MainWindow.pEntry; + if (entry != NULL) { + elm_object_focus_set(entry, EINA_TRUE); + } + } + return; +} + +void mf_callback_set_otg_state_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + mf_retm_if(ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL, "mf_Status.path is NULL"); + + mf_debug("path is %s", ap->mf_Status.path->str); + + if (ap->mf_FileOperation.otg_dev_list != NULL) { + mf_otg_list_clean(ap, MF_OTG_LIST_DEV); + } + + mf_otg_init(ap); + vconf_notify_key_changed(VCONFKEY_SYSMAN_ADDED_USB_STORAGE, __mf_callback_otg_connected_cb, ap); + vconf_notify_key_changed(VCONFKEY_SYSMAN_REMOVED_USB_STORAGE, __mf_callback_otg_removal_cb, ap); +} +#endif +/****** end of USB otg connection/removal handler ******/ + + +static GString *__mf_callback_dir_pipe_get_parent(GString *path) +{ + + mf_retvm_if(path == NULL, NULL, "path is NULL"); + mf_retvm_if(path->str == NULL, NULL, "path->str is NULL"); + + if (ecore_file_exists(path->str)) { + return path; + } else if (mf_fm_svc_wrapper_is_root_path(path->str)) { + return path; + } else { + GString *parent = mf_fm_svc_wrapper_get_file_parent_path(path); + SAFE_FREE_GSTRING(path); + __mf_callback_dir_pipe_get_parent(parent); + } + return path; +} +static void __mf_callback_dir_pipe_cb(void *data, void *buffer, unsigned int nbyte) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + + if (ap->mf_Status.more != MORE_DEFAULT) + return; + if (ap->mf_Status.view_type == mf_view_root || ap->mf_Status.view_type == mf_view_root_category) { + return; + } + if (g_strcmp0(ap->mf_Status.monitor_path, ap->mf_Status.path->str)) { + return; + } + if (buffer) { + mf_dir_event_t *msg = (mf_dir_event_t *) buffer; + mf_debug("event : %d, name : %s", msg->event, msg->name); + + int iIsNoContent = 0; + Evas_Object *newContent = NULL; + + iIsNoContent = ap->mf_Status.flagNoContent; + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + GString *parent = NULL; + GString *current = NULL; + Evas_Object *parent_obj = NULL; + char *path = NULL; + int count = 0; + + switch (msg->event) { + case MF_INOTI_CREATE: + case MF_INOTI_MOVE_IN: + if(msg->name) { + path = g_strconcat(ap->mf_Status.path->str, "/", msg->name, NULL); + int file_type = 0; + if (mf_file_attr_is_dir(path)) { + file_type = FILE_TYPE_DIR; + } else { + file_type = FILE_TYPE_FILE; + } + fsNodeInfo *pNode = mf_util_generate_pnode(path, file_type); + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + if (ap->mf_MainWindow.pNaviGenlist == NULL) { + ap->mf_MainWindow.pNaviGenlist = mf_widget_create_genlist(ap->mf_MainWindow.pNaviBar); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,right", mf_genlist_gl_mode_sweep_set, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,left", mf_genlist_gl_mode_sweep_unset, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,up", mf_genlist_gl_mode_cancel, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,down", mf_genlist_gl_mode_cancel, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "selected", mf_genlist_gl_selected, ap); + + evas_object_del(elm_object_part_content_unset(ap->mf_MainWindow.pNaviLayout, "content")); + elm_object_part_content_set(ap->mf_MainWindow.pNaviLayout, "content", ap->mf_MainWindow.pNaviGenlist); + } + parent_obj = ap->mf_MainWindow.pNaviGenlist; + } else { + if (ap->mf_MainWindow.pNaviGengrid == NULL) { + ap->mf_MainWindow.pNaviGengrid = mf_gengrid_create(ap->mf_MainWindow.pNaviBar); + evas_object_del(elm_object_part_content_unset(ap->mf_MainWindow.pNaviLayout, "content")); + elm_object_part_content_set(ap->mf_MainWindow.pNaviLayout, "content", ap->mf_MainWindow.pNaviGengrid); + } + parent_obj = ap->mf_MainWindow.pNaviGengrid; + } + mf_widget_item_append(parent_obj, pNode, ap); + + if (pNode != NULL) { + SAFE_FREE_CHAR(pNode->path); + SAFE_FREE_CHAR(pNode->name); + SAFE_FREE_CHAR(pNode->ext); + free(pNode); + pNode = NULL; + } + } + /*1 TODO: add new item to list */ + if (ap->mf_Status.more == MORE_DEFAULT && iIsNoContent) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, false); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_NOCONTENT_VIEW, false); + } + break; + case MF_INOTI_DELETE: + case MF_INOTI_MOVE_OUT: + path = g_strconcat(ap->mf_Status.path->str, "/", msg->name, NULL); + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + it = elm_genlist_first_item_get(ap->mf_MainWindow.pNaviGenlist); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_ItemName == NULL || itemData->m_ItemName->str == NULL) { + mf_debug(); + continue; + } + if (g_strcmp0(path, itemData->m_ItemName->str) == 0) { + elm_object_item_del(it); + break; + } + + it = elm_genlist_item_next_get(it); + } + count = elm_genlist_items_count(ap->mf_MainWindow.pNaviGenlist); + ap->mf_Status.flagNoContent = !count; + + } else { + it = elm_gengrid_first_item_get(ap->mf_MainWindow.pNaviGengrid); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_ItemName == NULL || itemData->m_ItemName->str == NULL) { + continue; + } + if (g_strcmp0(path, itemData->m_ItemName->str) == 0) { + elm_object_item_del(it); + break; + } + + it = elm_gengrid_item_next_get(it); + } + count = elm_gengrid_items_count(ap->mf_MainWindow.pNaviGengrid); + ap->mf_Status.flagNoContent = !count; + + } + /*1 TODO: remove item from list */ + if (ap->mf_Status.more == MORE_DEFAULT && ap->mf_Status.flagNoContent) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, true); + } + break; + case MF_INOTI_MODIFY: +#ifdef MYFILE_SPLIT_VIEW + //todo: optmize the refresh + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_widget_refresh_view(ap); + } + else +#endif + { + newContent = mf_navi_bar_content_create(ap); + Evas_Object *pConformant = mfNaviBarConformGet(ap); + mfNaviBarSetContent(ap, pConformant, newContent); + } + /*1 TODO: update item in list */ + break; + case MF_INOTI_DELETE_SELF: + case MF_INOTI_MOVE_SELF: + { + current = g_string_new(ap->mf_Status.path->str); + parent = __mf_callback_dir_pipe_get_parent(current); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + ap->mf_Status.path = parent; +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + int storage = mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str); + if (storage == MYFILE_OTG) { /* a usb disk take into use */ + char *dev_in_use = mf_otg_get_node_in_use(ap); + if (dev_in_use != NULL) + mf_otg_set_node_using_flag(ap, dev_in_use, FALSE); + } +#endif + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(parent->str); + + + + mf_widget_refresh_view(ap); + } + break; + default: + mf_error("Unknown event"); + break; + } + + + if (msg->name) + free(msg->name); + SAFE_FREE_CHAR(path); + mf_inotify_handle_request_handled_send(); + } +} + +static void __mf_callback_dir_update_cb(mf_inotify_event event, char *name, void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + + mf_debug("event : %d, name : %s", event, name); + + mf_dir_event_t buffer; + + buffer.event = event; + buffer.name = strdup(name); + + ecore_pipe_write(ap->mf_FileOperation.inotify_pipe, &buffer, sizeof(buffer)); + + return; +} + +int mf_callback_add_dir_watch(const char *path, void *data) +{ + mf_retvm_if(data == NULL, 0, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + SAFE_FREE_CHAR(ap->mf_Status.monitor_path); + ap->mf_Status.monitor_path = g_strdup(path); + return mf_inotify_handle_add_watch(path, __mf_callback_dir_update_cb, data); +} + +int mf_callback_remove_dir_watch(void) +{ + return mf_inotify_handle_rm_watch(); +} + +int mf_callback_create_dir_monitor(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, -1, "appdata is NULL"); + + if (ap->mf_FileOperation.inotify_pipe) + ecore_pipe_del(ap->mf_FileOperation.inotify_pipe); + + ap->mf_FileOperation.inotify_pipe = ecore_pipe_add(__mf_callback_dir_pipe_cb, (const void *)ap); + + return mf_inotify_handle_init_inotify(); +} + +void mf_callback_destory_dir_monitor(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "appdata is NULL"); + + if (ap->mf_FileOperation.inotify_pipe) { + ecore_pipe_del(ap->mf_FileOperation.inotify_pipe); + ap->mf_FileOperation.inotify_pipe = NULL; + } + + mf_inotify_handle_finalize_inotify(); + + return; +} + +void mf_callback_backbutton_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.more == MORE_DEFAULT) { + if (ap->mf_Status.view_type == mf_view_root) { + Evas_Object *win = ap->mf_MainWindow.pWindow; + elm_win_lower(win); + } else if (ap->mf_Status.view_type == mf_view_root_category) { + ap->mf_Status.view_type = mf_view_root; + mf_widget_refresh_view(ap); + } else { + mf_callback_upper_click_cb(ap, NULL, NULL); + } + } else { + mf_callback_cancel_cb(ap, NULL, NULL); + } +} + +void mf_callback_new_folder_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); + + Eina_Bool entry_empty = elm_entry_is_empty(ap->mf_MainWindow.pEntry); + + if (entry_empty) { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,hide", "elm"); + } else { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,show", "elm"); + } + MF_TRACE_END; + +} +void mf_callback_imf_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); + + const char *entry_data = NULL; + char *name = NULL; + char new_str[MYFILE_FILE_NAME_LEN_MAX] = { '\0', }; + + entry_data = elm_entry_entry_get(ap->mf_MainWindow.pEntry); + mf_retm_if(entry_data == NULL, "entry_data is null"); + name = elm_entry_markup_to_utf8(entry_data); + mf_retm_if(name == NULL, "name is null"); + + Eina_Bool entry_empty = elm_entry_is_empty(ap->mf_MainWindow.pEntry); + + if (entry_empty) { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,hide", "elm"); + } else { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,show", "elm"); + } + + if (mf_file_attr_is_valid_name(name) != MYFILE_ERR_NONE) { + strncpy(new_str, name, MYFILE_FILE_NAME_LEN_MAX - 1); + if (strlen(name) > 0) + new_str[strlen(name) - 1] = '\0'; + elm_entry_entry_set(ap->mf_MainWindow.pEntry, new_str); + elm_entry_cursor_end_set(ap->mf_MainWindow.pEntry); + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_FALSE); + + if (ap->mf_MainWindow.pNormalPopup) { + SAFE_FREE_OBJ(ap->mf_MainWindow.pNormalPopup); + } + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, GET_STR(MF_MSG_RENAME_ILLEGAL_CHAR), NULL, NULL, + NULL, mf_popup_show_vk_cb, ap); + } + SAFE_FREE_CHAR(name); + MF_TRACE_END; +} + + +void mf_callback_rename_button_callback(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *)data; + mf_retm_if(params == NULL, "input data is NULL"); + + struct appdata *ap = (struct appdata *)params->ap; + mf_retm_if(ap == NULL, "input ap is NULL"); + + Elm_Object_Item *it = params->item; + mf_retm_if(it == NULL, "input item is NULL"); + + myfileNaviBar *pNavi_toshow = NULL; + pNavi_toshow = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_toshow == NULL, "get navi in use failed"); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_callback_rename_save_cb(ap, NULL, NULL); + } + mf_genlist_sweep_item_recover(ap->mf_MainWindow.pNaviGenlist); + + ap->mf_Status.preMore = ap->mf_Status.more; + ap->mf_Status.more = MORE_RENAME; + elm_genlist_item_flip_set(it, EINA_TRUE); + elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_NONE); + ap->mf_FileOperation.rename_item = it; + + if (ap->mf_Status.preMore == MORE_DEFAULT) { + + mf_navi_bar_set_upper_item_disable(ap, true); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_DEFAULT_ALL, true); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_DEFAULT_ALL, TRUE); + } else { + ap->mf_Status.iCtrlDisableItem = mf_navi_bar_button_get_disable(ap->mf_MainWindow.pNaviItem); + mf_debug("ap->mf_Status.iCtrlDisableItem is [%d]", ap->mf_Status.iCtrlDisableItem); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, true); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_EDIT_ALL, TRUE); + } + + + MF_TRACE_END; +} +void mf_callback_detail_ctx_cb(void *data, Evas_Object * obj, void *event_info) +{ + mf_retm_if(data == NULL, "data is NULL"); + mfItemData_s *itemData = (mfItemData_s *)data; + struct appdata* ap = (struct appdata *)itemData->ap; + mf_retm_if(ap == NULL, "ap is NULL"); + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + mf_launch_load_ug(ap, itemData->m_ItemName->str, MF_LOAD_UG_DETAIL, NULL); +} +static void __mf_callback_delete_in_idle(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(LABEL_CANCEL)) == 0 ) { + SAFE_FREE_OBJ(ap->mf_MainWindow.pNormalPopup); + return; + } else if (g_strcmp0(label, GET_SYS_STR(LABEL_DELETE)) == 0 ) { + SAFE_FREE_OBJ(ap->mf_MainWindow.pNormalPopup); + + GList *pSourceList = NULL; + int count = 0; + + mf_util_merge_eina_list_to_glist(ap->mf_FileRecordList.value_saver, &pSourceList); + + if (pSourceList) { + count = g_list_length(pSourceList); + } else { + MF_TRACE_END; + return; + } + mf_callback_init_operation_cancel(ap); + ap->mf_FileOperation.iTotalCount = count; + ap->mf_Status.preMore = ap->mf_Status.more; + ap->mf_Status.more = MORE_IDLE_DELETE; + ap->mf_FileOperation.pSourceList = pSourceList; + ap->mf_FileOperation.iOperationSuccessFlag = TRUE; + mf_delete_items(pSourceList, ap->mf_FileOperation.pCancel, TRUE, ap); + SAFE_FREE_OBJ(ap->mf_MainWindow.pProgressPopup); + ap->mf_MainWindow.pProgressPopup = mf_popup_create_pb_popup(ap, GET_SYS_STR(MF_MSG_DELETING), count, mf_callback_progress_bar_cancel_cb, ap); + } +} + +void mf_callback_delete_button_cb(void *data, Evas_Object * obj, void *event_info) +{ + + mfItemData_s *params = (mfItemData_s *) data; + struct appdata *ap = (struct appdata *)params->ap; + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + if (ap->mf_FileRecordList.value_saver != NULL) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.value_saver, MYFILE_TYPE_GSTRING); + ap->mf_FileRecordList.value_saver = NULL; + } + ap->mf_FileRecordList.value_saver = eina_list_append(ap->mf_FileRecordList.value_saver, g_string_new(params->m_ItemName->str)); + SAFE_FREE_OBJ(ap->mf_MainWindow.pNormalPopup); + ap->mf_FileOperation.idle_delete_item = params->item; + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TITLE_TEXT_TWO_BTN, + NULL, + GET_SYS_STR(MF_BUTTON_LABEL_DEL), + GET_SYS_STR(LABEL_DELETE), GET_SYS_STR(LABEL_CANCEL), + NULL, __mf_callback_delete_in_idle, ap); +} + +void mf_callback_view_as_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_VIEW_AS_LIST, GET_STR(LABEL_VIEW_AS), NULL, NULL, NULL, NULL, mf_callback_popup_deleted_cb, ap); +} +void mf_callback_view_style_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST) { + ap->mf_Status.flagViewType = MF_VIEW_STYLE_THUMBNAIL; + } else { + ap->mf_Status.flagViewType = MF_VIEW_STYLE_LIST; + } + + mf_util_set_view_style(ap->mf_Status.flagViewType); + + if (ap->mf_Status.flagNoContent != EINA_TRUE) { + mf_widget_refresh_view(ap); + } + MF_TRACE_END; +} + +void mf_callback_home_button_pressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *home_button_ic = (Evas_Object *)data; + elm_image_file_set(home_button_ic, MF_TITLE_ICON_HOME_PRESS, NULL); +} + +void mf_callback_home_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *home_button_ic = (Evas_Object *)data; + elm_image_file_set(home_button_ic, MF_TITLE_ICON_HOME, NULL); +} + +void mf_callback_select_all_button_pressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *select_all_button_ic = (Evas_Object *)data; + elm_image_file_set(select_all_button_ic, MF_TITLE_ICON_SELECT_ALL_PRESS, NULL); +} + +void mf_callback_select_all_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *select_all_button_ic = (Evas_Object *)data; + elm_image_file_set(select_all_button_ic, MF_TITLE_ICON_SELECT_ALL, NULL); +} + +void mf_callback_home_button_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + int storage = MYFILE_PHONE; + myfileNaviBar *pNavi_s = NULL; + + + pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "pNavi_s is NULL"); + + mf_callback_remove_dir_watch(); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_callback_destory_rename(ap); + } + +#ifdef MYFILE_SPLIT_VIEW + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_set_panes_navi_to_main(ap); + + } +#endif + { + storage = mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str); + mf_error("storage is [%d] ap->mf_Status.path->str is [%s]", storage, ap->mf_Status.path->str); + switch (storage) { + case MYFILE_PHONE: + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(PHONE_FOLDER); + break; + case MYFILE_MMC: + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(MEMORY_FOLDER); + break; + case MYFILE_OTG: + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(OTG_FOLDER); + break; + default: + return; + } + } + ap->mf_Status.view_type = mf_view_root; +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + if (storage == MYFILE_OTG) { /* a usb disk take into use */ + char *dev_in_use = mf_otg_get_node_in_use(ap); + if (dev_in_use != NULL) + mf_otg_set_node_using_flag(ap, dev_in_use, FALSE); + } +#endif + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = g_strdup(ap->mf_Status.path->str); + + if (ap->mf_MainWindow.pNaviItem) { + mf_navi_bottom_item_del(&ap->mf_MainWindow.pNaviItem); + } + mf_widget_refresh_view(ap); + MF_TRACE_END; +} + +void mf_callback_more_button_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + ap->mf_Status.navi_item_selected = MF_NAVI_BTN_MORE; + mf_context_popup_create_more(ap, obj); + return; +} + +void mf_callback_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + elm_entry_entry_set(data, ""); +} + +void mf_callback_list_by_button_callback(void *data, Evas_Object * obj, void *event_info) +{ + assert(data); + assert(obj); + struct appdata *ap = (struct appdata *)data; + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + int iListBySortType = 0; + + if (g_strcmp0(label, GET_STR(MF_LABEL_DESCENDING)) == 0 ) { + switch(ap->mf_Status.iSelectedSortType) { + case 0: + iListBySortType = MYFILE_SORT_BY_NAME_Z2A; + break; + case 1: + iListBySortType = MYFILE_SORT_BY_DATE_R2O; + break; + + case 2: + iListBySortType = MYFILE_SORT_BY_SIZE_L2S; + break; + case 3: + iListBySortType = MYFILE_SORT_BY_TYPE_Z2A; + break; + default: + iListBySortType = MYFILE_SORT_BY_DATE_R2O; + break; + } + } else if(g_strcmp0(label, GET_STR(MF_LABEL_ASCENDING)) == 0 ) { + switch(ap->mf_Status.iSelectedSortType) { + case 0: + iListBySortType = MYFILE_SORT_BY_NAME_A2Z; + break; + case 1: + iListBySortType = MYFILE_SORT_BY_DATE_O2R; + break; + + case 2: + iListBySortType = MYFILE_SORT_BY_SIZE_S2L; + break; + case 3: + iListBySortType = MYFILE_SORT_BY_TYPE_A2Z; + break; + default: + iListBySortType = MYFILE_SORT_BY_DATE_O2R; + break; + } + + } + mf_util_set_sort_type(iListBySortType); + mf_callback_list_by_response_cb(ap); +} + +void mf_callback_sbeam_cb(void *user_data) +{ + MF_TRACE_BEGIN; + mf_retm_if(user_data == NULL, "user_data is NULL"); + + struct appdata *ap = (struct appdata *)user_data; + + if (ap->mf_FileRecordList.selected_files) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.selected_files, MYFILE_TYPE_GSTRING); + } + ap->mf_FileRecordList.selected_files = mf_util_get_all_selected(ap); + + Eina_List *files = NULL; + + if (ap->mf_Status.more == MORE_EDIT) { + files = mf_util_get_all_selected(ap); + } + + mf_sbeam_share_files(ap->mf_MainWindow.pWindow, files); + mf_util_free_eina_list_with_data(&files, MYFILE_TYPE_GSTRING); + files = NULL; +} + +void mf_callback_extension_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "user_data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + Evas_Object *playout = ap->mf_MainWindow.pNaviLayout; + mf_retm_if(playout == NULL, "get conformant failed"); + Evas_Object *newContent = NULL; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + const char *label = elm_object_item_text_get(item); + if (g_strcmp0(label, GET_STR(MF_LABEL_SHOW_EXTENSION)) == 0) { + mf_util_set_extension_state(MF_EXTENSION_SHOW); + ap->mf_Status.iExtensionState = MF_EXTENSION_SHOW; + } else if (g_strcmp0(label, GET_STR(MF_LABEL_HIDE_EXTENSION)) == 0) { + mf_util_set_extension_state(MF_EXTENSION_HIDE); + ap->mf_Status.iExtensionState = MF_EXTENSION_HIDE; + } else { + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + return; + } + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + if (ap->mf_Status.flagNoContent != EINA_TRUE) { + newContent = mf_navi_bar_content_create(ap); + mfNaviBarSetContent(ap, playout, newContent); + } + ap->mf_Status.more = MORE_DEFAULT; +} + +/****************************** +** Prototype : mf_callback_nofity_show_callback +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_nofity_show_callback(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + edje_object_signal_emit(_EDJ(ap->mf_MainWindow.pLabelLayout), "elm,state,show,default", "elm"); + return; +} + +/****************************** +** Prototype : mf_callback_nofity_hide_callback +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_callback_nofity_hide_callback(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "invalid parameter ap is NULL"); + + edje_object_signal_emit(_EDJ(ap->mf_MainWindow.pLabelLayout), "elm,state,hide,default", "elm"); + return; +} + +void mf_callback_operation_timeout_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + if (obj) { + evas_object_del(obj); + ap->mf_MainWindow.pLabelLayout = NULL; + ap->mf_MainWindow.pOperationNotify = NULL; + } + MF_TRACE_END; + return; +} + +Eina_Bool mf_callback_popup_del_idler_cb(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + SAFE_FREE_OBJ(ap->mf_MainWindow.pNormalPopup); + ap->mf_Status.popup_del_idler = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +#ifdef MYFILE_MOTION_FEATURE + +void mf_callback_motion_double_tap(Evas_Object *genlist) +{ + MF_TRACE_BEGIN; + mf_retm_if(genlist == NULL, "genlist is NULL"); + Elm_Object_Item *item = elm_genlist_first_item_get(genlist); + elm_genlist_item_bring_in(item, ELM_GENLIST_ITEM_SCROLLTO_TOP); + +} +#endif + +void mf_callback_profile_changed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + const char *profile = elm_config_profile_get(); + + if (!strcmp(profile, "desktop")) { + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, "prev_btn", NULL); + elm_win_indicator_mode_set(ap->mf_MainWindow.pWindow, ELM_WIN_INDICATOR_HIDE); + } + else { // mobile + Evas_Object *btn = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_style_set(btn, "naviframe/end_btn/default"); + evas_object_smart_callback_add(btn, "clicked", mf_callback_backbutton_clicked_cb, ap); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, "prev_btn", btn); + + elm_win_indicator_mode_set(ap->mf_MainWindow.pWindow, ELM_WIN_INDICATOR_SHOW); + } +} + +void mf_callback_share_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + int share_mode = SHARE_MODE_NORMAL; + int file_mode = 0; + + { + if (ap->mf_FileRecordList.selected_files) { + mf_util_free_eina_list_with_data(&ap->mf_FileRecordList.selected_files, MYFILE_TYPE_GSTRING); + } + ap->mf_FileRecordList.selected_files = mf_util_get_all_selected(ap); + + file_mode = mf_share_mode_get(ap->mf_FileRecordList.selected_files); + + if ((file_mode & SHARE_FILE_MODE_OTHERS) || ((file_mode & SHARE_FILE_MODE_IMAGE) && (file_mode & SHARE_FILE_MODE_VIDEO))) { + share_mode = SHARE_MODE_NORMAL; + } else if (file_mode & SHARE_FILE_MODE_MULTI_IMAGE) { + share_mode = SHARE_MODE_MULTI_IMAGE; + } else if (file_mode & SHARE_FILE_MODE_MULTI_VIDEO) { + share_mode = SHARE_MODE_MULTI_VIDEO; + } else if (file_mode & SHARE_FILE_MODE_IMAGE) { + share_mode = SHARE_MODE_IMAGE; + } else if (file_mode & SHARE_FILE_MODE_VIDEO) { + share_mode = SHARE_MODE_VIDEO; + } else { + share_mode = SHARE_MODE_NORMAL; + } + mf_context_popup_create_share(ap, share_mode, obj); + + } +} + +void mf_callback_thumb_created_cb(media_content_error_e error, const char *path, void *user_data) +{ + mf_retm_if(user_data == NULL, "user_data is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + mfItemData_s *pListData = (mfItemData_s *)user_data; + mf_retm_if(pListData->item == NULL, "pListData->item is NULL"); + + if (ecore_file_exists(path)) { + mf_debug("Update item with new thumbnail[%s]", path); + SAFE_FREE_CHAR(pListData->thumb_path); + pListData->thumb_path = g_strdup(path); + pListData->real_thumb_flag = TRUE; + if (pListData->ap->mf_Status.flagViewType == MF_VIEW_STYLE_THUMBNAIL) { + elm_gengrid_item_update(pListData->item); + } else { + elm_genlist_item_update(pListData->item); + } + } else { + mf_debug("Invalid thumb path!"); + } +} + +bool mf_callback_create_thumbnail(void *data, media_thumbnail_completed_cb callback) +{ + mf_retvm_if(data == NULL, -1, "filter is NULL"); + mfItemData_s *pListData = (mfItemData_s *)data; + + int ret = -1; + + ret = media_info_create_thumbnail(pListData->media, callback, + pListData); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + mf_debug("Failed to create thumbnail! ret is [%d]", ret); + return -1; + } + return 0; + + return false; +} +void mf_callback_entry_button_pressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *entry_button_ic = (Evas_Object *)data; + elm_image_file_set(entry_button_ic, MF_ICON_ENTRY_FOLDER_PRESS, NULL); +} + +void mf_callback_entry_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + Evas_Object *entry_button_ic = (Evas_Object *)data; + elm_image_file_set(entry_button_ic, MF_ICON_ENTRY_FOLDER, NULL); +} + +void mf_callback_entry_cb(void *data, Evas_Object * obj, void *event_info) +{ + mf_retm_if(data == NULL, "data is NULL"); + mfItemData_s *pItemData = (mfItemData_s *)data; + + struct appdata *ap = pItemData->ap; + + if (ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL) { + return; + } + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + GString *path = mf_fm_svc_wrapper_get_file_parent_path(pItemData->m_ItemName); + mf_retm_if(path == NULL, "path is NULL"); + mf_retm_if(path->str == NULL, "path->str is NULL"); + + int error_code = 0; + int mmc_card = 0; + bool result = FALSE; + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + + error_code = mf_util_is_mmc_on(&mmc_card); + if (ap->mf_Status.more == MORE_DEFAULT + || ap->mf_Status.more == MORE_INTERNAL_COPY + || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE) { + if (mf_fm_svc_wrapper_is_dir(path)) { + +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + error_code = 0; + error_code = mf_file_attr_is_disk_link(path->str, &result); + if (error_code == 0 && result == TRUE) { /* a usb disk take into use */ + /* + **we don't need to set the previous device flag to be false + **because click cannot jump from one device to another + */ + mf_otg_set_node_using_flag(ap, path->str,TRUE); + } +#endif + /*set new path */ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = path; + + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(path->str); + ap->mf_Status.view_type = mf_view_normal; + mf_widget_refresh_view(ap); + } + } +} + +void mf_callback_imf_preedit_change_cb(void *data, Evas_Object *obj, void *event_info) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + Eina_Bool entry_empty = elm_entry_is_empty(ap->mf_MainWindow.pEntry); + + if (entry_empty) { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,hide", "elm"); + } else { + elm_object_signal_emit(ap->mf_MainWindow.pEditField, "elm,state,eraser,show", "elm"); + } + + return; +#if 0 + SAFE_FREE(view_data->editing_text); + const char *preedit_str = elm_entry_entry_get(obj); + view_data->editing_text = g_strdup(preedit_str); +#endif +} +void mf_callback_imf_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *entry = (Evas_Object *)data; + elm_object_focus_set(entry, EINA_FALSE); +} + +void mf_callback_naviframe_title_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *navi_it = event_info; + if (!navi_it) return; + + + Evas_Object *label = elm_object_item_part_content_get(navi_it, "elm.swallow.title"); + if (!label) + return; + elm_label_slide_go(label); +} + +static void __mf_callback_sip_imf_show_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + + Evas_Object *nf = ap->mf_MainWindow.pNaviBar; + + if (!nf) return; + + Elm_Object_Item *navi_it = elm_naviframe_top_item_get(nf); + + if (!navi_it) return; + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + elm_naviframe_item_title_visible_set(navi_it, EINA_TRUE); + } + elm_object_item_signal_emit(navi_it, "elm,state,toolbar,instant_open", ""); + MF_TRACE_END; +} + + +static void __mf_callback_sip_imf_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + + Evas_Object *nf = ap->mf_MainWindow.pNaviBar; + + if (!nf) return; + + Elm_Object_Item *navi_it = elm_naviframe_top_item_get(nf); + + if (!navi_it) return; + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + elm_naviframe_item_title_visible_set(navi_it, EINA_FALSE); + } + elm_object_item_signal_emit(navi_it, "elm,state,toolbar,instant_close", ""); + MF_TRACE_END; +} + + +void mf_callback_imf_state_callback_register(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + Evas_Object *conform = ap->mf_MainWindow.pConformant; + evas_object_smart_callback_add(conform, "virtualkeypad,state,off", __mf_callback_sip_imf_hide_cb, ap); + + evas_object_smart_callback_add(conform, "virtualkeypad,state,on", __mf_callback_sip_imf_show_cb, ap); + + evas_object_smart_callback_add(conform, "clipboard,state,off", __mf_callback_sip_imf_hide_cb, ap); + + evas_object_smart_callback_add(conform, "clipboard,state,on", __mf_callback_sip_imf_show_cb, ap); + + MF_TRACE_END; +} + +void mf_callback_imf_state_callback_del(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + Evas_Object *conform = ap->mf_MainWindow.pConformant; + evas_object_smart_callback_del(conform, "virtualkeypad,state,on", __mf_callback_sip_imf_show_cb); + + evas_object_smart_callback_del(conform, "virtualkeypad,state,off", __mf_callback_sip_imf_hide_cb); + + evas_object_smart_callback_del(conform, "clipboard,state,on", __mf_callback_sip_imf_show_cb); + + evas_object_smart_callback_del(conform, "clipboard,state,off", __mf_callback_sip_imf_hide_cb); + + MF_TRACE_END; + +} + diff --git a/src/common/mf-drm.c b/src/common/mf-drm.c new file mode 100644 index 0000000..1f89b8c --- /dev/null +++ b/src/common/mf-drm.c @@ -0,0 +1,87 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + + +#include +#include + +#include "mf-main.h" +#include "mf-fs-util.h" +#include "mf-drm.h" + +int mf_drm_is_converted_fl(char *path) +{ + drm_bool_type_e is_allowed = 0; + drm_action_type_e action = DRM_IS_FORWARDING_ALLOWED; + drm_action_allowed_data_s action_data; + + int ret = -1; + memset(&action_data,0x0,sizeof(drm_action_allowed_data_s)); + + SAFE_STRCPY(action_data.file_path, path); + + ret = drm_is_action_allowed(action,&action_data,&is_allowed); + if(DRM_RETURN_SUCCESS == ret && DRM_TRUE == is_allowed){ + return true; + }else{ + return false; + } +} + +int mf_drm_is_drm_file(const char *file_fullpath) +{ + if (file_fullpath == NULL) + return MYFILE_ERR_DRM_PERMISSION_DENY; + drm_bool_type_e drmFlag = DRM_FALSE; + int res = 0; + res = drm_is_drm_file(file_fullpath, &drmFlag); + + if (res == DRM_RETURN_SUCCESS && drmFlag == DRM_TRUE) + return 0; + else + return MYFILE_ERR_DRM_PERMISSION_DENY; +} + +drm_file_mime_type_e mf_drm_check_drm_mime_type(char *mime_type) +{ + gchar **result = NULL; + if (mime_type != NULL) { + result = g_strsplit(mime_type, "/", 0); + if (result && *result) { + if (g_strcmp0(*result, "audio") == 0) { + g_strfreev(result); + return MYFILE_DRM_RINGTONE_FILE; + } else if (g_strcmp0(*result, "image") == 0) { + g_strfreev(result); + return MYFILE_DRM_IMAGE_FILE; + } else { + g_strfreev(result); + return MYFILE_DRM_UNKNOW_FILE; + } + } else { + g_strfreev(result); + return MYFILE_DRM_UNKNOW_FILE; + } + } else { + return MYFILE_DRM_UNKNOW_FILE; + } +} + diff --git a/src/common/mf-fm-svc-wrapper.c b/src/common/mf-fm-svc-wrapper.c new file mode 100644 index 0000000..164af1f --- /dev/null +++ b/src/common/mf-fm-svc-wrapper.c @@ -0,0 +1,1183 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include + +#include "mf-util.h" +#include "mf-callback.h" +#include "mf-widget.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-inotify-handle.h" +#include "mf-media-content.h" + +#define MF_PATH_INFO_RETRENCH 128 +#define MF_PATH_INFO_HEAD_LEN(x) strlen(x) +#define MF_PATH_INFO_TRANS_OMIT elm_entry_utf8_to_markup("..") +#define MF_PATH_INFO_LEVEL_BOUNDARY 3 +#define MF_PATH_INFO_LEN_THRESHOLD 4 +#define MF_PATH_INFO_SEP elm_entry_utf8_to_markup("/") +typedef struct { + int len_orig; + int len_trans; + char *original; + char *transfer; + bool flag_trans; +}pNode; +extern pthread_mutex_t pb_mutex; +static int __mf_fm_svc_wrapper_get_unique_name(const char *default_dir_full_path, char *original_file_name, char **unique_file_name, + int file_name_type, void *data); +/********************* +**Function name: __mf_fm_svc_wrapper_COMESFROM +**Parameter: +** GString* fullpath: fullpath to check the location +** +**Return value: +** location of the path +** +**Action: +** get storage type by fullpath +*********************/ +static int __mf_fm_svc_wrapper_COMESFROM(const char *fullpath) +{ + + int len_phone = strlen(PHONE_FOLDER); + int len_memory = strlen(MEMORY_FOLDER); +#ifdef MYFILE_USB_OTG + int len_otg = strlen(OTG_FOLDER); +#endif + + if (strncmp(fullpath, PHONE_FOLDER, len_phone) == 0) { + return MYFILE_PHONE; + } else if (strncmp(fullpath, MEMORY_FOLDER, len_memory) == 0) { + return MYFILE_MMC; +#ifdef MYFILE_USB_OTG + } else if (strncmp(fullpath, OTG_FOLDER, len_otg) == 0) { + return MYFILE_OTG; +#endif + } else { + return MYFILE_ERR_STORAGE_TYPE_ERROR; + } +} + +/********************* +**Function name: mf_fm_svc_wrapper_get_location +**Parameter: +** GString* fullpath: fullpath to check the location +** +**Return value: +** location of the path +** +**Action: +** get storage type by fullpath +*********************/ + +int mf_fm_svc_wrapper_get_location(const char *fullpath) +{ + return __mf_fm_svc_wrapper_COMESFROM(fullpath); +} + +/********************* +**Function name: mf_fm_svc_wrapper_detect_duplication +**Parameter: +** GString* fullpath: fullpath to check the duplication +** +**Return value: +** TRUE if duplication detected +** FALSE if duplication not detected +** +**Action: +** check if the destination is duplicated +*********************/ +bool mf_fm_svc_wrapper_detect_duplication(GString *to) +{ + int existing = MYFILE_ERR_NONE; + if (to == NULL) { + return false; + } + GString *parent_path = mf_fm_svc_wrapper_get_file_parent_path(to); + GString *file_name = mf_fm_svc_wrapper_get_file_name(to); + + mf_debug("full path and file name %s", to->str); + if (file_name == NULL || parent_path == NULL || file_name->len == 0) { + return false; + } + + if (parent_path->str != NULL) { + mf_debug("parent_path->str is %s", parent_path->str); + } + if (file_name->str != NULL) { + mf_debug("file_name->str is %s", file_name->str); + } + + existing = mf_file_attr_is_duplicated_name(parent_path->str, file_name->str); + + mf_debug("EXIST result is %d", existing); + + if (parent_path != NULL) { + g_string_free(parent_path, TRUE); + } + parent_path = NULL; + + if (file_name != NULL) { + g_string_free(file_name, TRUE); + } + file_name = NULL; + + if (existing == MYFILE_ERR_NONE) { + return false; + } else { + return true; + } +} + +/********************* +**Function name: mf_fm_svc_wrapper_detect_recursion +**Parameter: +** GString* from: the dir to check +** GString* to: the dir to operate +** +**Return value: +** error code +** +**Action: +** check if the to path is recursive with the from path +*********************/ +int mf_fm_svc_wrapper_detect_recursion(GString *from, GString *to) +{ + /* recurion detection */ + int ret = 0; + mf_debug(); + int lensrc = from->len; + int lendst = to->len; + + if (lensrc == 0 || lendst == 0 || lensrc > lendst) { + return MYFILE_REPORT_NONE; + } + MF_STORAGE from_store_type = MYFILE_NONE; + MF_STORAGE to_store_type = MYFILE_NONE; + + if ((ret = mf_file_attr_get_store_type_by_full(from->str, &from_store_type)) != 0) { + return ret; + } + if ((ret = mf_file_attr_get_store_type_by_full(to->str, &to_store_type)) != 0) { + return ret; + } + + if (from_store_type != to_store_type) { + return MYFILE_REPORT_NONE; + } + + GString *from_parent = mf_fm_svc_wrapper_get_file_parent_path(from); + GString *to_parent = mf_fm_svc_wrapper_get_file_parent_path(to); + if (g_string_equal(from_parent, to_parent)) { + SAFE_FREE_GSTRING(from_parent); + SAFE_FREE_GSTRING(to_parent); + return MYFILE_REPORT_NONE; + } + if (strncmp(from->str, to->str, lensrc) == 0) { + return MYFILE_REPORT_RECURSION_DETECT; + } else { + return MYFILE_REPORT_NONE; + } +} + +char *mf_fm_svc_wrapper_get_root_path_by_tab_label(const char *label) +{ + if (g_strcmp0(label, GET_SYS_STR(MF_LABEL_PHONE)) == 0) + return g_strdup(PHONE_FOLDER); + else if (g_strcmp0(label, GET_SYS_STR(MF_LABEL_MMC)) == 0) + return g_strdup(MEMORY_FOLDER); +#ifdef MYFILE_USB_OTG + else if (g_strcmp0(label, GET_STR(MF_LABEL_OTG)) == 0) + return g_strdup(OTG_FOLDER); +#endif + else + return NULL; +} + +/********************* +**Function name: mf_fm_svc_wrapper_file_auto_rename +**Parameter: +** GString* from: the dir to check +** GString* to: the dir to operate +** +**Return value: +** error code +** +**Action: +** check if the to path is recursive with the from path +*********************/ +int mf_fm_svc_wrapper_file_auto_rename(void *data, GString *fullpath, int file_name_type, GString **filename) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + GString *parent_path = mf_fm_svc_wrapper_get_file_parent_path(fullpath); + GString *file_name = mf_fm_svc_wrapper_get_file_name(fullpath); + + if (parent_path == NULL || file_name == NULL) { + return MYFILE_ERR_GENERATE_NAME_FAIL; + } + if (parent_path->str == NULL || file_name->str == NULL) { + g_string_free(parent_path, TRUE); + parent_path = NULL; + g_string_free(file_name, TRUE); + file_name = NULL; + return MYFILE_ERR_GENERATE_NAME_FAIL; + } + + char *name = NULL; + int error_code = 0; + + if (parent_path->str != NULL) { + //mf_debug("parent_full_path is [%s]", parent_path->str); + } + + if (file_name->str != NULL) { + //mf_debug("original_file_name is [%s]", file_name->str); + } + error_code = __mf_fm_svc_wrapper_get_unique_name(parent_path->str, file_name->str, &name, file_name_type, ap); + if (error_code) { + SAFE_FREE_CHAR(name); + return MYFILE_ERR_GENERATE_NAME_FAIL; + } + g_string_append_printf(parent_path, "/%s", name); + mf_debug("After gstring append, PATH ::: [%s]", parent_path->str); + + if (file_name != NULL) { + g_string_free(file_name, TRUE); + } + + file_name = NULL; + if (name != NULL) { + free(name); + name = NULL; + } + + *filename = parent_path; + return MYFILE_ERR_NONE; +} + +/********************* +**Function name: mf_fm_svc_wrapper_get_folder_foldersystem +**Parameter: +** GString* path: +** path need to check +** bool *result: +** output result +** +**Return value: +** error code +** +**Action: +** check if the to path is system folder +*********************/ +gint mf_fm_svc_wrapper_get_folder_foldersystem(GString *path, bool *result) +{ + + int error_code = 0; + mf_debug("Start"); + /*ToDo: How to tell if the folder is System folder? */ + error_code = mf_file_attr_is_system_dir(path->str, result); + mf_debug("nerror_code is %d\nresult is %d", error_code, *result); +#ifdef MYFILE_USB_OTG + if(*result == false) + error_code = mf_file_attr_is_disk_link(path->str, result); +#endif + return error_code; + +} + +/********************* +**Function name: mf_fm_svc_wrapper_get_file_list +**Parameter: +** GString* folder_name: +** path to read +** Eina_List** dir_list: +** output value of dir element +** Eina_List** file_list +** output value of file element +** +**Return value: +** error code +** +**Action: +** read elements under the specified dir +*********************/ +int mf_fm_svc_wrapper_get_file_list(const char *folder_name, Eina_List **dir_list, Eina_List **file_list) +{ + mf_debug("Start"); + int error_code = 0; + + mf_retvm_if(folder_name == NULL, MYFILE_ERR_INVALID_PATH, "folder_name is NULL"); + error_code = mf_fs_oper_read_dir(folder_name, dir_list, file_list); + if (error_code != 0) { + mf_error("error_code is [%d]\n", error_code); + } else { + mf_error("success get the file list\n"); + } + + return error_code; +} + +/****************************** +** Prototype : mf_fm_svc_wrapper_classify_dir_list +** Description : classify the dir list into default and user defined +** Input : Eina_List *dir_list +** Eina_List **default_dir_list +** Eina_List **user_dir_list +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +int mf_fm_svc_wrapper_classify_dir_list(Eina_List *dir_list, Eina_List **default_dir_list, Eina_List **user_dir_list) +{ + int error_code = MYFILE_ERR_NONE; + fsNodeInfo *pNode = NULL; + Eina_List *l = NULL; + + EINA_LIST_FOREACH(dir_list, l, pNode) { + char *real_name = NULL; + bool result = false; + GString *foldername = NULL; + real_name = g_strconcat(pNode->path, "/", pNode->name, NULL); + + if (real_name) { + foldername = g_string_new(real_name); + } else { + continue; + } + int error_code = mf_fm_svc_wrapper_get_folder_foldersystem(foldername, &result); + + if (error_code == 0 && result == true) { + mf_debug("in default"); + *default_dir_list = eina_list_append(*default_dir_list, pNode); + } else { + mf_debug("in else"); + *user_dir_list = eina_list_append(*user_dir_list, pNode); + } + } + return error_code; +} + + +/********************* +**Function name: mf_fm_svc_wrapper_is_root_path +**Parameter: +** void *data: +** global variable to keep status +** +**Return value: +** Non-Zero if it's the root path +** MYFILE_NONE if not +** +**Action: +** check if current path is root path +*********************/ +int mf_fm_svc_wrapper_is_root_path(const char *fullpath) +{ + assert(fullpath); + mf_debug("path is [%s]\n", fullpath); + + if (!g_strcmp0(fullpath, PHONE_FOLDER)) { + mf_debug("PHONE_FOLDER"); + return MYFILE_PHONE; + } else if (!g_strcmp0(fullpath, MEMORY_FOLDER)) { + mf_debug("MEMORY_FOLDER"); + return MYFILE_MMC; +#ifdef MYFILE_USB_OTG + } else if (!g_strcmp0(fullpath, OTG_FOLDER)){ + mf_debug("OTG_FOLDER"); + return MYFILE_OTG; +#endif + + } else { + mf_debug("Not root path"); + return MYFILE_NONE; + } +} + +/********************* +**Function name: mf_fm_svc_wrapper_is_dir +**Parameter: +** GString* path: +** full path of the file +** +**Return value: +** TRUE if path is a directory +** FALSE if not +** +**Action: +** check if the path is a directory +*********************/ +gboolean mf_fm_svc_wrapper_is_dir(GString *path) +{ + return mf_file_attr_is_dir(path->str); +} + + +/********************* +**Function name: mf_fm_svc_wrapper_get_file_name +**Parameter: +** GString* path: +** full path of the file +** +**Return value: +** file name +** +**Action: +** get file name from full path +*********************/ +GString *mf_fm_svc_wrapper_get_file_name(GString *path) +{ + GString *ret = g_string_new(ecore_file_file_get(path->str)); + return ret; +} + + +/********************* +**Function name: mf_fm_svc_wrapper_get_file_parent_path +**Parameter: +** GString* path: +** full path of the file +** +**Return value: +** parent path of the current path +** +**Action: +** get parent path from the full path +*********************/ +GString *mf_fm_svc_wrapper_get_file_parent_path(GString *fullpath) +{ + GString *ret = NULL; + char *path = NULL; + int error_code = 0; + + if (fullpath == NULL || fullpath->str == NULL) { + return NULL; + } + error_code = mf_file_attr_get_parent_path(fullpath->str, &path); + if (error_code != 0) { + return NULL; + } + + ret = g_string_new(path); + SAFE_FREE_CHAR(path); + return ret; +} + +/********************* +**Function name: mf_fm_svc_wrapper_get_free_space +**Parameter: +** int state: +** storage to check +** +**Return value: +** free space on the storage +** +**Action: +** get free space on the storage +*********************/ +unsigned long mf_fm_svc_wrapper_get_free_space(int state) +{ + struct statvfs info; + char *path = NULL; + + if (state == MYFILE_PHONE) { + path = PHONE_FOLDER; + } else if (state == MYFILE_MMC) { + path = MEMORY_FOLDER; + } else { + return -1; + } + + if (-1 == statvfs(path, &info)) { + return -2; + } + return (info.f_bsize) * info.f_bfree; +} + +/********************* +**Function name: mf_fm_svc_wrapper_create_service +**Parameter: +** void *data: +** global variable to store data +** GString* fullpath +** the path to create +** +**Return value: +** error code +** +**Action: +** create the specified path +*********************/ +int mf_fm_svc_wrapper_create_service(void *data, GString *fullpath) +{ + int error_code; + + mf_callback_remove_dir_watch(); + error_code = mf_fs_oper_create_dir(fullpath->str); + + if (error_code != 0) { + mf_debug("Make DIR error\n"); + } else { +; mf_media_content_scan_folder(fullpath->str); + } + + return error_code; +} + + +/********************* +**Function name: mf_fm_svc_wrapper_rename_service +**Parameter: +** void *data: +** global variable to store data +** GString* from: +** source file +** GString* to: +** destination file +** +**Return value: +** error code +** +**Action: +** rename the specified file to the destination +*********************/ +int mf_fm_svc_wrapper_rename_service(void *data, GString *from_fullpath, GString *to) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + int error_code = 0; + + mf_callback_remove_dir_watch(); + + error_code = mf_fs_oper_rename_file(from_fullpath->str, to->str); + if (error_code != 0) { + mf_debug("rename failed %d\n", error_code); + } else { + if (mf_fm_svc_wrapper_is_dir(to)) { + mf_media_content_scan_folder(to->str); + } else { + mf_media_content_scan_file(to->str); + } + } + + return error_code; +} + +/********************* +**Function name: __mf_fm_svc_wrapper_get_next_number +**Parameter: +** char* file_name_without_ext: +** file name +** int file_name_type: +** file name type +** +**Return value: +** error code +** +**Action: +** get the next file number +*********************/ +static int __mf_fm_svc_wrapper_get_next_number(char *file_name_without_ext, int file_name_type) +{ + int nCount = 0; + int nLength = 0; + int nUnderline = 0; + bool bAllDigits = true; + int i; + + /* check _02d format */ + nLength = strlen(file_name_without_ext); + + if (file_name_type == FILE_NAME_WITH_UNDERLINE) { + if (nLength < 3) { /*4 means the # of minimum characters (*_n) */ + return 1; /*doesn't match */ + } else { /* input is more than 3 bytes */ + /* find '_' */ + for (nUnderline = nLength - 1; nUnderline >= 0; nUnderline--) { + if (file_name_without_ext[nUnderline] == '_') { + break; + } + } + + if (nUnderline == 0 && file_name_without_ext[0] != '_') { + return 1; /* doesn't match */ + } + /* check the right characters are all digits */ + for (i = nUnderline + 1; i < nLength; i++) { + if (file_name_without_ext[i] < '0' || file_name_without_ext[i] > '9') { + bAllDigits = false; + break; + } + } + + if (bAllDigits) { + for (i = nUnderline + 1; i < nLength; i++) { + nCount *= 10; + nCount += file_name_without_ext[i] - '0'; + } + + file_name_without_ext[nUnderline] = '\0'; /* truncate the last '_dd' */ + } + } + } else { + + if (nLength < 5) { /* 5 means the # of minimum characters (*_(n)) */ + return 1; /*doesn't match */ + } else { /* input is more than 3 bytes */ + /* find '_' */ + for (nUnderline = nLength - 1; nUnderline >= 0; nUnderline--) { + if (file_name_without_ext[nUnderline] == '(') { + break; + } + } + + if (nUnderline == 0 && file_name_without_ext[0] != '(') { + return 1; /* doesn't match */ + } + /* check the right characters are all digits */ + for (i = nUnderline + 1; i < nLength - 1; i++) { + if (file_name_without_ext[i] < '0' || file_name_without_ext[i] > '9') { + bAllDigits = false; + break; + } + } + + /* and more than 2 columns. */ + if (bAllDigits) { + for (i = nUnderline + 1; i < nLength - 1; i++) { + nCount *= 10; + nCount += file_name_without_ext[i] - '0'; + } + + file_name_without_ext[nUnderline] = '\0'; /* truncate the last '_dd' */ + } + } + } + + /* increase nCount by 1 */ + nCount++; + + return nCount; +} + + +char *mf_fm_svc_path_info_retrench(const char *string) +{ + mf_retvm_if(string == NULL, g_strdup(MF_PATH_INFO_TRANS_OMIT), "input path is NULL"); + char *retrench = NULL; + char *utf8_string = elm_entry_utf8_to_markup(string); + if (utf8_string && strlen (string) > MF_PATH_INFO_LEN_THRESHOLD) { + if (g_utf8_strlen(utf8_string, -1) > 2) { + retrench = calloc(1, MF_PATH_INFO_RETRENCH); + if (retrench) { + char *omit = MF_PATH_INFO_TRANS_OMIT; + char *temp = g_utf8_strncpy(retrench, utf8_string, 2); + retrench = g_strconcat(temp, omit, NULL); + SAFE_FREE_CHAR(omit); + SAFE_FREE_CHAR(temp); + } + SAFE_FREE_CHAR(utf8_string); + + } else { + retrench = utf8_string; + } + return retrench; + } else { + return utf8_string; + } +} + +static void __mf_fm_svc_wrapper_path_info_node_free(Eina_List *list) +{ + mf_retm_if(list == NULL, "list is NULL"); + const Eina_List *l = NULL; + void *data = NULL; + EINA_LIST_FOREACH(list, l, data) { + pNode *node = (pNode *)data; + if (node != NULL) { + SAFE_FREE_CHAR(node->original); + SAFE_FREE_CHAR(node->transfer); + SAFE_FREE_CHAR(node); + } + } + eina_list_free(list); +} + +char *mf_fm_svc_path_info_translate(char *path_info, int path_info_max_len) +{ + + mf_retvm_if(path_info == NULL, g_strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")), "input path is NULL"); + + int top = 0; + bool flag = TRUE; + Eina_List *temp_list = NULL; + const Eina_List *l = NULL; + gchar **result = NULL; + gchar **params = NULL; + int count = 0; + int max_len = 0; + int total_len = 0; + int i = 0; + char *output = NULL; + void *pnode = NULL; + char *omit = MF_PATH_INFO_TRANS_OMIT; + + if (strlen(path_info) < path_info_max_len) { + SAFE_FREE_CHAR(omit); + return path_info; + } + + result = g_strsplit(path_info, "/", 0); + if (result == NULL) { + free(path_info); + path_info = NULL; + SAFE_FREE_CHAR(omit); + return g_strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")); + } + + params = result; + count = g_strv_length(result); + + if (count > MF_PATH_INFO_LEVEL_BOUNDARY) + { + top = MF_PATH_INFO_LEVEL_BOUNDARY; + flag = FALSE; + max_len = path_info_max_len - MF_PATH_INFO_LEVEL_BOUNDARY - MF_PATH_INFO_HEAD_LEN(omit);//(2 is length of ..) ../aa../bb../*** + } + else + { + top = count; + flag = TRUE; + max_len = path_info_max_len - (count-1); + } + + for(i = top; i > 1; i--) + { + pNode *nodeB = calloc(sizeof(pNode), 1); + nodeB->original = elm_entry_utf8_to_markup(params[count -i]); + nodeB->len_orig = strlen(params[count - i]); + nodeB->transfer = mf_fm_svc_path_info_retrench(params[count-i]); + nodeB->len_trans = strlen(nodeB->transfer); + nodeB->flag_trans = FALSE; + total_len += nodeB->len_orig; + + temp_list = eina_list_append(temp_list, nodeB); + } + + total_len += strlen(params[count - 1]); + + for (i = 0 ; i < eina_list_count(temp_list); i++) + { + if (total_len > max_len) + { + pNode *data = NULL; + data = eina_list_nth(temp_list, i); + total_len -= (data->len_orig - data->len_trans); + data->flag_trans = TRUE; + } + + if (total_len <= max_len) + break; + } + + + if (flag == FALSE) + { + output = elm_entry_utf8_to_markup(".."); + } + char *temp = NULL; + char *sep = MF_PATH_INFO_SEP; + EINA_LIST_FOREACH(temp_list, l, pnode) + { + pNode *node = (pNode *)pnode; + temp = output; + if(node->flag_trans == TRUE) + { + if (output != NULL) + output = g_strconcat(output, sep, node->transfer, NULL); + else + output = g_strdup(node->transfer); + } + else + { + if (output != NULL) + output = g_strconcat(output, sep ,node->original, NULL); + else + output = g_strdup(node->original); + } + SAFE_FREE_CHAR(temp); + } + temp = output; + char *last_string = params[count - 1]; + char *utf8_last = elm_entry_utf8_to_markup(last_string); + + if (output != NULL) { + int last_len = strlen(last_string); + int output_len = strlen(output); + int d_value = path_info_max_len - output_len; + if ((last_len + output_len) > path_info_max_len) { + mf_debug(); + + const char *end = NULL; + gboolean ret = FALSE; + ret = g_utf8_validate(utf8_last, d_value, &end); + if (ret == TRUE) { + d_value = last_len - strlen(end); + utf8_last[d_value] = '\0'; + output = g_strconcat(output, sep, utf8_last, omit, NULL); + SAFE_FREE_CHAR(temp); + } + } else { + output = g_strconcat(output, sep, utf8_last, NULL); + SAFE_FREE_CHAR(temp); + } + } + else { + output = g_strdup(utf8_last); + SAFE_FREE_CHAR(temp); + } + SAFE_FREE_CHAR(utf8_last); + + SAFE_FREE_CHAR(sep); + SAFE_FREE_CHAR(omit); + SAFE_FREE_CHAR(path_info); + __mf_fm_svc_wrapper_path_info_node_free(temp_list); + temp_list = NULL; + g_strfreev(result); + result = NULL; + return output; +} +/********************* +**Function name: __mf_fm_svc_wrapper_get_unique_name +**Parameter: +** const char* default_dir_full_path +** char* original_file_name, +** char* unique_file_name, +** int file_name_type, +** void* data +** +**Return value: +** error code +** +**Action: +** get the unique name of the file name +*********************/ +static int __mf_fm_svc_wrapper_get_unique_name(const char *default_dir_full_path, char *original_file_name, char **unique_file_name, + int file_name_type, void *data) +{ + //mf_debug("%s %d\n", __func__, __LINE__); + assert(unique_file_name); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Eina_List *l = NULL; + GString *content = NULL; + const char *file_name = NULL; + + char *file_name_without_ext = NULL; + char *file_ext = NULL; + char *new_file_name = NULL; + bool result = false; + char *dir_rel_path = NULL; + int slash = 1; + int nCount = 0; + bool bExt = false; + int error_code = 0; + + if (default_dir_full_path == NULL || original_file_name == NULL) { + MYFILE_TRACE_DEBUG("default_dir_full_path == NULL || \ + original_file_name == NULL || \ + unique_file_name == NULL || \ + error_code == NULL "); + error_code = MYFILE_ERR_SRC_ARG_INVALID; + goto Exception; + } + result = mf_file_attr_get_logical_path_by_full(default_dir_full_path, &dir_rel_path); + + if (result) { + error_code = MYFILE_ERR_GET_LOGIC_PATH_FAIL; + goto Exception; + } + + if (strncmp(dir_rel_path, "/", strlen(dir_rel_path)) == 0) { + slash = 0; + } +#ifdef MYFILE_CHECK_DIR_FILE_PATH_MAXIMUM_LENGTH + if (mf_util_character_count_get(dir_rel_path) + mf_util_charactor_count_get(original_file_name) + slash > MYFILE_FILE_PATH_LEN_MAX) { + MYFILE_TRACE_DEBUG("......(%s/%s) exceeds maximum length: %d...", dir_rel_path, original_file_name, MYFILE_FILE_PATH_LEN_MAX); + error_code = MYFILE_ERR_EXCEED_MAX_LENGTH; + goto Exception; + } +#endif + error_code = mf_file_attr_is_duplicated_name(default_dir_full_path, original_file_name); + if (error_code == 0) { + mf_debug("unique_file_name [%s]", *unique_file_name); + mf_debug("original_file_name [%s]", new_file_name); + *unique_file_name = g_strdup(original_file_name); + mf_debug("unique_file_name [%s]", *unique_file_name); + } + + while (error_code < 0) { + error_code = 0; + bExt = mf_file_attr_get_file_ext(original_file_name, &file_ext); + file_name_without_ext = g_strdup(original_file_name); + + if (file_name_without_ext == NULL) { + error_code = MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + goto Exception; + } + + /* add a condition, whether extention is or not. */ + if (bExt == 0) { + file_name_without_ext[strlen(file_name_without_ext) - strlen(file_ext) - 1] = '\0'; + } + + nCount = __mf_fm_svc_wrapper_get_next_number(file_name_without_ext, file_name_type); + if (nCount == 1 && file_name_type == FILE_NAME_WITH_BRACKETS) { + char *file_name_with_space = g_strconcat(file_name_without_ext, " ", NULL); + if (file_name_with_space) { + SAFE_FREE_CHAR(file_name_without_ext); + file_name_without_ext = file_name_with_space; + file_name_with_space = NULL; + } + } + + if (bExt == 0) { + if (file_name_type == FILE_NAME_WITH_BRACKETS) + new_file_name = g_strdup_printf("%s(%d).%s", file_name_without_ext, nCount, file_ext); + else + new_file_name = g_strdup_printf("%s_%d.%s", file_name_without_ext, nCount, file_ext); + } else { + + if (file_name_type == FILE_NAME_WITH_BRACKETS) + new_file_name = g_strdup_printf("%s(%d)", file_name_without_ext, nCount); + else + new_file_name = g_strdup_printf("%s_%d", file_name_without_ext, nCount); + } + //mf_debug("new_file_name [%s]", new_file_name); + //mf_debug("original_file_name [%s]", new_file_name); + SAFE_FREE_CHAR(file_name_without_ext); + +#ifdef MYFILE_CHECK_DIR_FILE_PATH_MAXIMUM_LENGTH + if (mf_util_character_count_get(new_file_name) > MYFILE_FILE_NAME_LEN_MAX || + mf_util_character_count_get(dir_rel_path) + slash + mf_util_charactor_count_get(new_file_name) > MYFILE_FILE_PATH_LEN_MAX) { + MYFILE_TRACE_DEBUG("......(%s/%s) exceeds maximum length: %d...", dir_rel_path, new_file_name, MYFILE_FILE_PATH_LEN_MAX); + error_code = MYFILE_ERR_EXCEED_MAX_LENGTH; + goto Exception; + } +#endif + mf_debug("new name is %s\n", new_file_name); + if ((ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE) && (ap->mf_FileRecordList.selected_dest_files != NULL) + && (eina_list_count(ap->mf_FileRecordList.selected_dest_files) > 0)) + EINA_LIST_FOREACH(ap->mf_FileRecordList.selected_dest_files, l, content) { + if (content == NULL || content->str == NULL) { + continue; + } + //mf_debug("dest is %s\n", content->str); + file_name = ecore_file_file_get(content->str); + //mf_debug("file_name is %s\n", file_name); + + error_code = ((strlen(file_name) == strlen(new_file_name)) && !strcmp(file_name, new_file_name)); + mf_debug("error_code is %d\n", error_code); + if (error_code == 1) { + break; + } + } + + if (error_code != 0) { + original_file_name = g_strdup(new_file_name); + error_code = MYFILE_ERR_DUPLICATED_NAME; + SAFE_FREE_CHAR(new_file_name); + SAFE_FREE_CHAR(file_ext); + continue; + } else { + error_code = mf_file_attr_is_duplicated_name(default_dir_full_path, new_file_name); + if (error_code == 0) { + *unique_file_name = g_strdup(new_file_name); + //mf_debug("rename finished\n"); + error_code = MYFILE_ERR_NONE; + goto Exception; + } else { + //mf_debug("rename continue\n"); + original_file_name = g_strdup(new_file_name); + SAFE_FREE_CHAR(new_file_name); + } + } + SAFE_FREE_CHAR(file_ext); + } + + return MYFILE_ERR_NONE; + +Exception: + SAFE_FREE_CHAR(dir_rel_path); + SAFE_FREE_CHAR(file_ext); + SAFE_FREE_CHAR(new_file_name); + return error_code; +} + +char *mf_fm_svc_path_info_get(const char *original_path) +{ + mf_retvm_if(original_path == NULL, g_strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")), "input path is NULL"); + char *path_info = NULL; + int len = 0; + + path_info = mf_fm_svc_wrapper_translate_path(original_path, MF_TRANS_OPTION_LABEL); + if (path_info) { + len = strlen(path_info); + if (len > 0 && path_info[len - 1] == '/') { + path_info[len - 1] = '\0'; + } + } + return path_info; + +} + +char *mf_fm_svc_wrapper_translate_path(const char *original_path, MF_TRANS_OPTION option) +{ + mf_retvm_if(original_path == NULL, g_strdup(dgettext("sys_string", "IDS_COM_BODY_UNKNOWN")), "input path is NULL"); + + char *new_path = NULL; + int root_len = 0; + + if (mf_fm_svc_wrapper_get_location(original_path) == MYFILE_PHONE) { + switch (option) { + case MF_TRANS_OPTION_POPUP: + if (strlen(original_path) > MF_TRANSLATE_LENGTH) { + new_path = + g_strconcat(GET_SYS_STR(MF_LABEL_PHONE), MF_TRANSLATE_OMIT_PART, ecore_file_file_get(original_path), "/", + NULL); + } else { + root_len = strlen(PHONE_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_PHONE), original_path + root_len, "/", NULL); + } + break; + case MF_TRANS_OPTION_LABEL: + root_len = strlen(PHONE_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_PHONE), original_path + root_len, "/", NULL); + break; + default: + new_path = g_strdup(original_path); + break; + } + + + } else if (mf_fm_svc_wrapper_get_location(original_path) == MYFILE_MMC) { + switch (option) { + case MF_TRANS_OPTION_POPUP: + if (strlen(original_path) > MF_TRANSLATE_LENGTH) { + new_path = + g_strconcat(GET_SYS_STR(MF_LABEL_MMC), MF_TRANSLATE_OMIT_PART, ecore_file_file_get(original_path), + NULL); + } else { + root_len = strlen(MEMORY_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_MMC), original_path + root_len, "/", NULL); + } + break; + case MF_TRANS_OPTION_LABEL: + root_len = strlen(MEMORY_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_MMC), original_path + root_len, "/", NULL); + break; + default: + new_path = g_strdup(original_path); + break; + } +#ifdef MYFILE_USB_OTG + } else if (mf_fm_svc_wrapper_get_location(original_path) == MYFILE_OTG) { + switch (option) { + case MF_TRANS_OPTION_POPUP: + if (strlen(original_path) > MF_TRANSLATE_LENGTH) { + new_path = + g_strconcat(GET_STR(MF_LABEL_OTG), MF_TRANSLATE_OMIT_PART, ecore_file_file_get(original_path), + NULL); + } else { + root_len = strlen(OTG_FOLDER); + new_path = g_strconcat(GET_STR(MF_LABEL_OTG), original_path + root_len, "/", NULL); + } + break; + case MF_TRANS_OPTION_LABEL: + root_len = strlen(OTG_FOLDER); + new_path = g_strconcat(GET_STR(MF_LABEL_OTG), original_path + root_len, "/", NULL); + break; + default: + new_path = g_strdup(original_path); + break; + } +#endif + } else { + new_path = g_strdup(original_path); + } + + mf_debug("new path is %s", new_path); + return new_path; +} + + +char *mf_fm_svc_get_file_name_without_ext(const char *name) +{ + mf_retv_if(name == NULL, NULL); + char *name_without_ext = NULL; + char *guide_text = NULL; + char *ext = NULL; + + name_without_ext = g_strdup(name); + mf_file_attr_get_file_ext(name, &ext); + mf_debug("ext is %s", ext); + if (ext && strlen(ext) != 0) { + name_without_ext[strlen(name_without_ext) - strlen(ext) - 1] = '\0'; + mf_debug("name_without_ext is [%s]\n", name_without_ext); + if (strlen(name_without_ext)) { + guide_text = elm_entry_utf8_to_markup(ecore_file_file_get(name_without_ext)); + } else { + guide_text = elm_entry_utf8_to_markup(name); + } + } else { + guide_text = elm_entry_utf8_to_markup(name); + } + SAFE_FREE_CHAR(ext); + SAFE_FREE_CHAR(name_without_ext); + return guide_text; +} + +char *mf_fm_svc_get_file_name(GString *path) +{ + mf_retv_if(path == NULL, NULL); + + GString *filename = NULL; + char *guide_text = NULL; + filename = mf_fm_svc_wrapper_get_file_name(path); + + guide_text = mf_fm_svc_get_file_name_without_ext(filename->str); + SAFE_FREE_GSTRING(filename); + return guide_text; +} + diff --git a/src/common/mf-inotify-handle.c b/src/common/mf-inotify-handle.c new file mode 100644 index 0000000..856f474 --- /dev/null +++ b/src/common/mf-inotify-handle.c @@ -0,0 +1,373 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-dlog.h" +#include "mf-inotify-handle.h" + +#define MF_WATCH_FLAGS \ + IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_MOVE_SELF | IN_MOVED_FROM | IN_MOVED_TO | IN_CLOSE_WRITE + +#define MF_EVENT_SIZE (sizeof(struct inotify_event)) +/** reasonable guess as to size of 1024 events */ +#define MF_EVENT_BUF_LEN (1024 * (MF_EVENT_SIZE + 16)) +#define MF_U32_MAX 0xFFFFFFFF + +int flagInotifyMsg = 1; +pthread_cond_t g_cond_inotify_msg; + +typedef struct _mf_inotify_t { + int fd; + int wd; + gchar *path; + unsigned int prev_event; + pthread_t monitor; + mf_inotify_cb callback; + void *u_data; +} mf_inotify_t; + +static pthread_mutex_t mf_noti_lock; +static mf_inotify_t *g_handle = NULL; + +static void __mf_inotify_handle_free(void) +{ + pthread_mutex_destroy(&mf_noti_lock); + + if (g_handle) { + if (g_handle->fd >= 0) { + close(g_handle->fd); + g_handle->fd = -1; + } + if (g_handle->path) { + g_free(g_handle->path); + g_handle->path = NULL; + } + g_free(g_handle); + g_handle = NULL; + } + + return; +} + +static mf_inotify_t *__mf_inotify_handle_init(void) +{ + __mf_inotify_handle_free(); + g_handle = g_new0(mf_inotify_t, 1); + + if (g_handle) { + g_handle->fd = -1; + g_handle->wd = -1; + pthread_mutex_init(&mf_noti_lock, NULL); + } + + return g_handle; +} + +static void __mf_inotify_handle_thread_clean_up(void *data) +{ + pthread_mutex_t *lock = (pthread_mutex_t *) data; + mf_debug("Thread cancel Clean_up function"); + if (lock) { + pthread_mutex_unlock(lock); + } + return; +} + + +static gpointer __mf_inotify_handle_watch_thread(gpointer user_data) +{ + mf_inotify_t *handle = (mf_inotify_t *) user_data; + int oldtype = 0; + + mf_retvm_if(handle == NULL, NULL, "handle is NULL"); + mf_debug("Create __mf_inotify_handle_watch_thread!!! "); + + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); + + while (1) { + ssize_t len = 0; + uint32_t i = 0; + char event_buff[MF_EVENT_BUF_LEN] = { 0, }; + + if (handle->fd < 0) { + mf_error("fd is not a vaild one"); + pthread_exit(NULL); + } + + len = read(handle->fd, event_buff, sizeof(event_buff) - 1); + if (len <= 0 || len > sizeof(event_buff) - 1) { + mf_error("Fail to read() -fd : %d, len : %d", handle->fd, len); + continue; + } + + flagInotifyMsg = 1; + + while (i < len) { + struct inotify_event *pevent = (struct inotify_event *)&event_buff[i]; + mf_inotify_event s_event = MF_INOTI_NONE; + mf_debug("mask=%x dir=%s len=%d name=%s", + pevent->mask, (pevent->mask & IN_ISDIR) ? "yes" : "no", pevent->len, (pevent->len) ? pevent->name : NULL); + + if (pevent->len && strncmp(pevent->name, ".", 1) == 0) { + s_event = MF_INOTI_NONE; + } else if (pevent->mask & IN_ISDIR) { + if (pevent->mask & IN_DELETE_SELF) + s_event = MF_INOTI_DELETE_SELF; + + if (pevent->mask & IN_MOVE_SELF) + s_event = MF_INOTI_MOVE_SELF; + + if (pevent->mask & IN_CREATE) + s_event = MF_INOTI_CREATE; + + if (pevent->mask & IN_DELETE) + s_event = MF_INOTI_DELETE; + + if (pevent->mask & IN_MOVED_FROM) + s_event = MF_INOTI_MOVE_OUT; + + if (pevent->mask & IN_MOVED_TO) + s_event = MF_INOTI_MOVE_IN; + } else { + if (pevent->mask & IN_CREATE) { + s_event = MF_INOTI_NONE; + handle->prev_event = IN_CREATE; + } + + if (pevent->mask & IN_CLOSE_WRITE) { + if (handle->prev_event == IN_CREATE) { + s_event = MF_INOTI_CREATE; + } else { + s_event = MF_INOTI_MODIFY; + } + handle->prev_event = 0; + } + + if (pevent->mask & IN_DELETE) + s_event = MF_INOTI_DELETE; + + if (pevent->mask & IN_MOVED_FROM) + s_event = MF_INOTI_MOVE_OUT; + + if (pevent->mask & IN_MOVED_TO) + s_event = MF_INOTI_MOVE_IN; + } + + mf_debug("s_event : %d, prev_event: %x, callback : %p", s_event, handle->prev_event, handle->callback); + if (s_event != MF_INOTI_NONE) { + pthread_cleanup_push(__mf_inotify_handle_thread_clean_up, (void *)&mf_noti_lock); + pthread_mutex_lock(&mf_noti_lock); + + while (flagInotifyMsg == 0) { + mf_debug("!!!!!!!!!!!! wait"); + pthread_cond_wait(&g_cond_inotify_msg, &mf_noti_lock); + } + flagInotifyMsg = 0; + + if (handle->callback) { + handle->callback(s_event, (pevent->len) ? pevent->name : NULL, handle->u_data); + } + pthread_mutex_unlock(&mf_noti_lock); + pthread_cleanup_pop(0); + } + + if ((MF_U32_MAX - pevent->len) >= MF_EVENT_SIZE) { + i += sizeof(struct inotify_event) + pevent->len; + } else { + break; + } + } + } + + mf_debug("end __mf_inotify_handle_watch_thread!!! "); + + return NULL; +} + +void mf_inotify_handle_request_handled_send() +{ + pthread_mutex_lock(&mf_noti_lock); + if (flagInotifyMsg == 0) { + flagInotifyMsg = 1; + pthread_cond_signal(&g_cond_inotify_msg); + } + pthread_mutex_unlock(&mf_noti_lock); +} + +int mf_inotify_handle_init_inotify(void) +{ + mf_inotify_t *handle = NULL; + handle = __mf_inotify_handle_init(); + mf_retvm_if(handle == NULL, -1, "fail to __mf_inotify_handle_init()"); + + handle->fd = inotify_init(); + + if (handle->fd < 0) { + switch (errno) { + case EMFILE: + mf_error("The user limit on the total number of inotify instances has been reached.\n"); + break; + case ENFILE: + mf_error("The system limit on the total number of file descriptors has been reached.\n"); + break; + case ENOMEM: + mf_error("Insufficient kernel memory is available.\n"); + break; + default: + mf_error("Fail to inotify_init(), Unknown error.\n"); + break; + } + return -1; + } + pthread_create(&handle->monitor, NULL, __mf_inotify_handle_watch_thread, handle); + return 0; +} + +int mf_inotify_handle_add_watch(const char *path, mf_inotify_cb callback, void *user_data) +{ + mf_inotify_t *handle = NULL; + handle = g_handle; + mf_retvm_if(handle == NULL, -1, "handle is NULL"); + + if (handle->wd >= 0) { + mf_warnig("The mf_notify module supports single instance, the watch descript [%d] is removed automatically\n", handle->wd); + mf_inotify_handle_rm_watch(); + } + + pthread_mutex_lock(&mf_noti_lock); + handle->wd = inotify_add_watch(handle->fd, path, MF_WATCH_FLAGS); + + if (handle->wd < 0) { + switch (errno) { + case EACCES: + mf_error("Read access to the given file is not permitted.\n"); + break; + case EBADF: + mf_error("The given file descriptor is not valid.\n"); + handle->fd = -1; + break; + case EFAULT: + mf_error("pathname points outside of the process's accessible address space.\n"); + break; + case EINVAL: + mf_error("The given event mask contains no legal events; or fd is not an inotify file descriptor.\n"); + break; + case ENOMEM: + mf_error("Insufficient kernel memory is available.\n"); + break; + case ENOSPC: + mf_error("User limit on the total number of inotify watches was reached or the kernel failed to alloc a needed resource.\n"); + break; + default: + mf_error("Fail to mf_inotify_handle_add_watch(), Unknown error.\n"); + break; + } + pthread_mutex_unlock(&mf_noti_lock); + return -1; + } + + mf_debug("start watching [%s] directory", path); + if (handle->path) { + g_free(handle->path); + handle->path = NULL; + } + handle->path = g_strdup(path); + handle->callback = callback; + handle->u_data = user_data; + pthread_mutex_unlock(&mf_noti_lock); + + return 0; +} + + + +int mf_inotify_handle_rm_watch(void) +{ + int ret = -1; + mf_inotify_t *handle = NULL; + + handle = g_handle; + mf_retvm_if(handle == NULL, -1, "handle is NULL"); + + if (handle->fd < 0 || handle->wd < 0) { + mf_warnig("inotify is not initialized or has no watching dir - fd [%d] wd [%d]", handle->fd, handle->wd); + return 0; + } + + pthread_mutex_lock(&mf_noti_lock); + + ret = inotify_rm_watch(handle->fd, handle->wd); + if (ret < 0) { + switch (errno) { + case EBADF: + mf_error("fd is not a valid file descriptor\n"); + handle->fd = -1; + break; + case EINVAL: + mf_error("The watch descriptor wd is not valid; or fd is not an inotify file descriptor.\n"); + handle->wd = -1; + break; + default: + mf_error("Fail to mf_inotify_handle_add_watch(), Unknown error.\n"); + break; + } + pthread_mutex_unlock(&mf_noti_lock); + return -1; + } + mf_debug("stop watching [%s] directory", handle->path); + if (handle->path) { + g_free(handle->path); + handle->path = NULL; + } + handle->callback = NULL; + handle->u_data = NULL; + handle->wd = -1; + pthread_mutex_unlock(&mf_noti_lock); + + return 0; +} + +void mf_inotify_handle_finalize_inotify(void) +{ + mf_inotify_t *handle = NULL; + handle = g_handle; + + mf_retm_if(handle == NULL, "handle is NULL"); + + if (handle->fd >= 0 && handle->wd >= 0) { + mf_inotify_handle_rm_watch(); + } + + pthread_cancel(handle->monitor); + pthread_join(handle->monitor, NULL); + + __mf_inotify_handle_free(); + + return; +} diff --git a/src/common/mf-language-mgr.c b/src/common/mf-language-mgr.c new file mode 100644 index 0000000..8afa0f5 --- /dev/null +++ b/src/common/mf-language-mgr.c @@ -0,0 +1,310 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include + +#include "mf-language-mgr.h" +#include "mf-dlog.h" +#include "mf-util.h" + +typedef struct +{ + Evas_Object *obj; + obj_type type; + const char *text_id; + const char *part; +}obj_data; + +typedef struct +{ + Elm_Object_Item *obj_item; + const char *text_id; + item_type type; +}obj_item_data; + +typedef struct _lang_mgr *lang_mgr; +struct _lang_mgr{ + GList *objs; + GList *obj_items; + GList *glist_items; + GList *grid_items; +}_lang_mgr; + + +static lang_mgr g_lang_mgr; + +#define G_LIST_FOREACH(list, l, data) \ + for (l = list, \ + data = g_list_nth_data(l, 0); \ + l; \ + l = g_list_next(l), \ + data = g_list_nth_data(l, 0)) + +static void __glist_free(void *data) +{ + obj_data *item = data; + MF_CHECK(item); + //if(item->text_id) + //free(item->text_id); + free(item); +} + + +static void __update_obj(void *data, void *userdata) +{ + char *text; + obj_data *item = data; + MF_CHECK(item); + mf_debug("handle: 0x%x, ID:%s",item->obj, item->text_id); + + text = mf_util_get_text(item->text_id); + + if(item->type == OBJ_TYPE_ELM_OBJECT) + elm_object_text_set(item->obj, text); + else if(item->type == OBJ_TYPE_EDJE_OBJECT) + edje_object_part_text_set(elm_layout_edje_get(item->obj), item->part, text); + else + mf_debug("Unhandled case"); +} + +static void __update_obj_item(void *data, void *userdata) +{ + char *text; + obj_item_data *item_data = data; + MF_CHECK(item_data); + mf_debug("handle: 0x%x, ID:%s",item_data->obj_item, item_data->text_id); + text = mf_util_get_text(item_data->text_id); + elm_object_item_text_set(item_data->obj_item, text); +} + +static void __update_list(void *data, void *userdata) +{ + Elm_Object_Item *item = data; + MF_CHECK(item); + mf_debug("handle: 0x%x",item); + elm_genlist_item_update(item); +} + +static void __update_grid(void *data, void *userdata) +{ + Elm_Object_Item *item = data; + MF_CHECK(item); + mf_debug("handle: 0x%x",item); + elm_gengrid_item_update(item); +} + +static void __obj_del_cb(void *data, Evas * e, Evas_Object * eo, void *event_info) +{ + obj_data *item = data; + MF_CHECK(g_lang_mgr); + MF_CHECK(item); + + g_lang_mgr->objs = + g_list_delete_link(g_lang_mgr->objs, g_list_find(g_lang_mgr->objs, item)); + + free(item); +} + +#if 0 +static void __obj_item_del_cb(void *data, Evas_Object *obj, void *event_info) +{ + mf_debug(""); + obj_item_data *item = data; + MF_CHECK(g_lang_mgr); + MF_CHECK(item); + + g_lang_mgr->obj_items= + g_list_delete_link(g_lang_mgr->obj_items, g_list_find(g_lang_mgr->obj_items, item)); + + free(item); +} +#endif + +int mf_language_mgr_create(void) +{ + mf_debug(""); + if(!g_lang_mgr) + { + lang_mgr mgr = calloc(1, sizeof(_lang_mgr)); + if(!mgr) + { + mf_debug("Error: calloc"); + return -1; + } + g_lang_mgr = mgr; + } + return 0; +} + +int mf_language_mgr_destroy(void) +{ + MF_CHECK_VAL(g_lang_mgr, -1); + g_list_free_full(g_lang_mgr->objs, __glist_free); + g_lang_mgr->objs = NULL; + + g_list_free(g_lang_mgr->glist_items); + g_lang_mgr->glist_items = NULL; + + g_list_free(g_lang_mgr->grid_items); + g_lang_mgr->grid_items = NULL; + + free(g_lang_mgr); + g_lang_mgr = NULL; + + return 0; +} + +void mf_language_mgr_register_object(Evas_Object *obj, obj_type type, const char *part, const char *text_id) +{ + MF_CHECK(g_lang_mgr); + obj_data *item = calloc(1, sizeof(obj_data)); + MF_CHECK(item); + + item->type = type; + item->part = part; + item->text_id = text_id; + item->obj = obj; + + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, __obj_del_cb, item); + + g_lang_mgr->objs = g_list_append(g_lang_mgr->objs, item); +} + +void mf_language_mgr_register_object_item(Elm_Object_Item *object_item, const char *text_ID, item_type type) +{ + mf_debug(); + MF_CHECK(g_lang_mgr); + mf_debug(); + obj_item_data *data = calloc(1, sizeof(obj_item_data)); + mf_debug(); + MF_CHECK(data); + mf_debug(); + + mf_debug("text id is [%s] item is [%p]", text_ID, object_item); + data->obj_item = object_item; + data->text_id = text_ID; + data->type = type; + + g_lang_mgr->obj_items= g_list_append(g_lang_mgr->obj_items, data); + mf_debug("======================length is [%d]", g_list_length(g_lang_mgr->obj_items)); + +} + +void mf_language_mgr_unregister_object_item(Elm_Object_Item *object_item) +{ + GList *l; + obj_item_data *data; + + G_LIST_FOREACH(g_lang_mgr->obj_items, l, data) + { + if (data == NULL || data->obj_item == NULL) { + continue; + } + if(data->obj_item == object_item) + { + g_lang_mgr->obj_items = g_list_delete_link(g_lang_mgr->obj_items, l); + free(data); + data = NULL; + break; + } + } +} + +void mf_language_mgr_unregister_object_item_by_type(item_type type) +{ + MF_TRACE_BEGIN; + GList *l; + obj_item_data *data; + GList *temp = NULL; + G_LIST_FOREACH(g_lang_mgr->obj_items, l, data) + { + if (data == NULL) { + continue; + } + if(data->type == type) + { + free(data); + data = NULL; + } else { + temp = g_list_append(temp, data); + } + } + + g_list_free(g_lang_mgr->obj_items); + g_lang_mgr->obj_items = temp; + + MF_TRACE_END; +} + + +void mf_language_mgr_object_item_text_ID_set(Elm_Object_Item *object_item, const char *text_ID) +{ + MF_CHECK(g_lang_mgr); + GList *l; + obj_item_data *data; + + G_LIST_FOREACH(g_lang_mgr->obj_items, l, data) + { + if(data->obj_item == object_item) + { + mf_debug("set ID: %s", text_ID); + data->text_id = text_ID; + break; + } + } + +} + +void mf_language_mgr_register_genlist_item(Elm_Object_Item *item) +{ + MF_CHECK(g_lang_mgr); + g_lang_mgr->glist_items = + g_list_append(g_lang_mgr->glist_items, item); +} + +void mf_language_mgr_unregister_genlist_item(Elm_Object_Item *item) +{ + MF_CHECK(g_lang_mgr); + g_lang_mgr->glist_items = + g_list_delete_link(g_lang_mgr->glist_items, g_list_find(g_lang_mgr->glist_items, item)); +} + +void mf_language_mgr_register_gengrid_item(Elm_Object_Item *item) +{ + MF_CHECK(g_lang_mgr); + g_lang_mgr->grid_items = + g_list_append(g_lang_mgr->grid_items, item); +} + +void mf_language_mgr_unregister_gengrid_item(Elm_Object_Item *item) +{ + MF_CHECK(g_lang_mgr); + g_lang_mgr->grid_items = + g_list_delete_link(g_lang_mgr->grid_items, g_list_find(g_lang_mgr->grid_items, item)); +} + +void mf_language_mgr_update() +{ + mf_debug("language changed. update text"); + MF_CHECK(g_lang_mgr); + g_list_foreach(g_lang_mgr->objs, __update_obj, NULL); + g_list_foreach(g_lang_mgr->obj_items, __update_obj_item, NULL); + g_list_foreach(g_lang_mgr->glist_items, __update_list, NULL); + g_list_foreach(g_lang_mgr->grid_items, __update_grid, NULL); +} + diff --git a/src/common/mf-launch.c b/src/common/mf-launch.c new file mode 100644 index 0000000..2a7563c --- /dev/null +++ b/src/common/mf-launch.c @@ -0,0 +1,482 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include "mf-main.h" +#include "mf-conf.h" +#include "mf-fs-util.h" +#include "mf-launch.h" +#include "mf-resource.h" +#include "mf-widget.h" +#include "mf-fm-svc-wrapper.h" + +#ifndef SAFE_STRING_FREE +#define SAFE_STRING_FREE(x) do { if ((x) != NULL) { free(x); x = NULL; } } while (0) +#endif + +#define EMAIL_UG_NAME "email-composer-efl" +#define MESSAGE_UG_NAME "msg-composer-efl" +#define BLUETOOTH_UG_NAME "setting-bluetooth-efl" +#define DETAIL_UG_NAME "myfile-detail-efl" +#define MYFILE_UG_NAME "myfile-efl" + + + +#define MF_SHARE_INTERNAL_LEN 12 +#define MF_ARGV_SNS_XWINDOW_ID "XWINDOW_ID" + +static void mf_launch_send_via_appcontrol(void *data, char *path, MF_LOAD_UG_TYPE type); + + +static void __mf_launch_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ + MF_TRACE_BEGIN; + mf_retm_if(priv == NULL, "priv is NULL"); + + Evas_Object *base = NULL; + + base = ug_get_layout(ug); + if (!base) { + ug_destroy(ug); + return; + } + + switch (mode) { + case UG_MODE_FULLVIEW: + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + //elm_win_resize_object_add(ap->mf_MainWindow.pWindow, base); + evas_object_show(base); + break; + default: + break; + } +} + +#if 0 +static void __mf_launch_ug_result_cb(ui_gadget_h ug, bundle * result, void *priv) +{ + MF_TRACE_BEGIN; + mf_retm_if(ug == NULL, "ug is NULL"); + mf_retm_if(priv == NULL, "priv is NULL"); + + ug_destroy(ug); + MF_TRACE_END; +} +#endif + +static void __mf_launch_ug_myfile_result_cb(ui_gadget_h ug, service_h service, void *priv) +{ + MF_TRACE_BEGIN; + mf_retm_if(priv == NULL, "priv is NULL"); + + struct appdata *ap = (struct appdata *)priv; + + service_h service_r = ap->mf_Bundle.recv_service; + service_h reply = NULL; + char *ret = NULL; + int service_ret = -1; + + if (service_create(&reply) != SERVICE_ERROR_NONE) { + mf_debug("service_create failed!"); + return; + } + + service_get_extra_data(service, "result", &ret); + + if (ret) { + service_add_extra_data(reply, SERVICE_DATA_SELECTED, ret); + service_ret = service_reply_to_launch_request(reply, service_r, + SERVICE_RESULT_SUCCEEDED); + } else { + service_ret = service_reply_to_launch_request(reply, service_r, + SERVICE_RESULT_CANCELED); + } + + service_destroy(reply); + if (service_ret != SERVICE_ERROR_NONE) + mf_debug("service_reply_to_launch_request failed!"); + + + ap->mf_SharedGadget.ug = NULL; + + if (mf_navi_bar_is_navi_empty(ap, GET_SYS_STR(MF_LABEL_PHONE)) == TRUE) { + elm_exit(); + } else { + elm_win_lower(ap->mf_MainWindow.pWindow); + } + + MF_TRACE_END; +} + +Eina_Bool mf_launch_myfile_ug_exist(void *data) +{ + mf_retvm_if(data == NULL, EINA_FALSE, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + if (mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str) == MYFILE_PHONE + && mf_navi_bar_is_navi_empty(ap, GET_SYS_STR(MF_LABEL_PHONE)) == TRUE) { + return EINA_TRUE; + } else { + return EINA_FALSE; + } +} + +static void __mf_launch_ug_destory_cb(ui_gadget_h ug, void *priv) +{ + MF_TRACE_BEGIN; + mf_retm_if(priv == NULL, "priv is NULL"); + + ug_destroy(ug); + struct appdata *ap = (struct appdata *)priv; + ap->mf_SharedGadget.ug = NULL; + ap->mf_Status.flagIME = EINA_TRUE; + MF_TRACE_END; +} + +static void __mf_launch_ug_myfile_ug_destory_cb(ui_gadget_h ug, void *priv) +{ + MF_TRACE_BEGIN; + mf_retm_if(priv == NULL, "priv is NULL"); + + ug_destroy(ug); + struct appdata *ap = (struct appdata *)priv; + ap->mf_SharedGadget.ug = NULL; + + if (mf_launch_myfile_ug_exist(ap)) { + elm_exit(); + } else { + elm_win_lower(ap->mf_MainWindow.pWindow); + } + MF_TRACE_END; +} + + +ui_gadget_h mf_launch_load_ug_myfile(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + ui_gadget_h ug = NULL; + struct ug_cbs cbs = { 0, }; + if (ap->mf_SharedGadget.ug) { + mf_debug("Already exits some Gallery UG called by me, destroy it first!"); + ug_destroy(ap->mf_SharedGadget.ug); + ap->mf_SharedGadget.ug = NULL; + } + + service_h service; + int ret = 0; + ret = service_create(&service); + + mf_retvm_if(ret != SERVICE_ERROR_NONE, NULL, "service create failed"); + + cbs.layout_cb = __mf_launch_ug_layout_cb; + cbs.result_cb = __mf_launch_ug_myfile_result_cb; + cbs.destroy_cb = __mf_launch_ug_myfile_ug_destory_cb; + cbs.priv = ap; + + UG_INIT_EFL(ap->mf_MainWindow.pWindow, UG_OPT_INDICATOR_ENABLE); + + service_add_extra_data(service, "path", ap->mf_Bundle.path); + service_add_extra_data(service, "select_type", ap->mf_Bundle.select_type); + service_add_extra_data(service, "file_type", ap->mf_Bundle.file_type); + service_add_extra_data(service, "marked_mode", ap->mf_Bundle.marked_mode); + service_add_extra_data(service, "drm_type", ap->mf_Bundle.drm_type); + ug = ug_create(NULL, MYFILE_UG_NAME, UG_MODE_FULLVIEW, service, &cbs); + + if (ug == NULL) { + mf_debug("Fail to Create UG"); + service_destroy(service); + MF_TRACE_END; + return NULL; + } else { + service_destroy(service); + MF_TRACE_END; + return ug; + } +} + +void mf_launch_sns_load(void *data, char *path, MF_LOAD_UG_TYPE type, char *file_count) +{ + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + + const char *pkg_name = NULL; + service_h service = NULL; + service_create(&service); + if (service == NULL) { + return; + } + switch (type) { + default: + break; + } + service_set_package(service, pkg_name); + int ret = service_send_launch_request(service, NULL, NULL); + + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_send_launch_request failed[%d]!", ret); + } + + service_destroy(service); + + return; +} +ui_gadget_h mf_launch_load_ug(void *data, char *path, MF_LOAD_UG_TYPE type, char *file_count) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + mf_retvm_if(path == NULL, NULL, "path is NULL"); + + if (type == MF_LOAD_UG_EMAIL + ) { + mf_launch_send_via_appcontrol(data, path, type); + return NULL; + } + struct appdata *ap = (struct appdata *)data; + ui_gadget_h ug = NULL; + struct ug_cbs cbs = { 0, }; + + service_h service; + int ret = 0; + ret = service_create(&service); + + mf_retvm_if(ret != SERVICE_ERROR_NONE, NULL, "service create failed"); + + cbs.layout_cb = __mf_launch_ug_layout_cb; + //cbs.result_cb = __mf_launch_ug_result_cb; + cbs.destroy_cb = __mf_launch_ug_destory_cb; + cbs.priv = ap; + + UG_INIT_EFL(ap->mf_MainWindow.pWindow, UG_OPT_INDICATOR_ENABLE); + + switch (type) { + case MF_LOAD_UG_MESSAGE: + service_add_extra_data(service, "ATTACHFILE", path); + ug = ug_create(NULL, MESSAGE_UG_NAME, UG_MODE_FULLVIEW, service, &cbs); + break; + case MF_LOAD_UG_BLUETOOTH: + service_add_extra_data(service, "launch-type", "send"); + service_add_extra_data(service, "filecount", file_count); + service_add_extra_data(service, "files", path); + ug = ug_create(NULL, BLUETOOTH_UG_NAME, UG_MODE_FULLVIEW, service, &cbs); + break; + case MF_LOAD_UG_DETAIL: + service_add_extra_data(service, "Path", path); + ug = ug_create(NULL, DETAIL_UG_NAME, UG_MODE_FULLVIEW, service, &cbs); + break; + + default: + break; + } + + if (ug == NULL) { + mf_debug("Fail to Create UG : %d", type); + service_destroy(service); + MF_TRACE_END; + return NULL; + } else { + if (type == MF_LOAD_UG_DETAIL) { + ap->mf_Status.flagIME = EINA_FALSE; + } + service_destroy(service); + MF_TRACE_END; + return ug; + } +} + +static void __mf_launch_service_reply_cb(service_h request, service_h reply, service_result_e result, void *user_data) +{ + MF_TRACE_BEGIN; + switch(result) { + case SERVICE_RESULT_SUCCEEDED: + mf_debug("SERVICE_RESULT_SUCCEEDED"); + break; + case SERVICE_RESULT_FAILED: + mf_debug("SERVICE_RESULT_FAILED"); + break; + case SERVICE_RESULT_CANCELED: + mf_debug("SERVICE_RESULT_CANCELED"); + break; + default: + mf_debug("Unhandled value: %d!", result); + break; + } + MF_TRACE_END; +} + +static void mf_launch_send_via_appcontrol(void *data, char *path, MF_LOAD_UG_TYPE type) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + + + struct appdata *ap = (struct appdata *)data; + const char *pkg_name = NULL; + service_h service = NULL; + int ret = service_create(&service); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_create()... [0x%x]", ret); + goto END; + } + + ret = service_set_operation(service, SERVICE_OPERATION_SEND); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_operation()... [0x%x]", ret); + goto END; + } + + switch (type) { + case MF_LOAD_UG_EMAIL: + ret = service_add_extra_data(service, "RUN_TYPE", "5"); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_add_extra_data()... [0x%x]", ret); + goto END; + } + pkg_name = EMAIL_UG_NAME; + + ret = service_set_app_id(service, pkg_name); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_app_id()... [0x%x]", ret); + goto END; + } + /* set window */ + ret = service_set_window(service, elm_win_xwindow_get(ap->mf_MainWindow.pWindow)); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_window()... [0x%x]", ret); + goto END; + } + break; + default: + mf_debug("Not supported type.. [%d]", type); + goto END; + } + + /* attatchment */ + ret = service_set_uri(service, path); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_uri()... [0x%x]", ret); + goto END; + } + + /* appcontrol name */ + + ret = service_send_launch_request(service, __mf_launch_service_reply_cb, NULL); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_send_launch_request()... [0x%x]", ret); + goto END; + } + + +END: + if (service) { + service_destroy(service); + service = NULL; + } + +} + + + + +/****************************** +** Prototype : mf_launch_service +** Description : +** Input : void *data +** char *path +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void result_cb(service_h request, service_h reply, service_result_e result, void *user_data) +{ + mf_debug("result is [%d]", result); +} + +int mf_launch_service(void *data, char *path) +{ + mf_retvm_if(data == NULL, LAUNCH_TYPE_FAIL, "data is NULL"); + mf_retvm_if(path == NULL, LAUNCH_TYPE_FAIL, "path is NULL"); + + fsFileType category = FILE_TYPE_NONE; + int ret = 0; + /* defence code */ + if (ecore_file_file_get(path) == NULL) { + return LAUNCH_TYPE_FAIL; + } + if (mf_file_attr_is_dir(path)) { + return LAUNCH_TYPE_DIR; + } + + + service_h service; + + ret = service_create(&service); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_create()... [0x%x]", ret); + goto END; + } + mf_file_attr_get_file_category(path, &category); + if (category == FILE_TYPE_HTML) { + char *html_path = g_strconcat("file://", path, NULL); + ret = service_set_uri(service, html_path); + SAFE_FREE_CHAR(html_path); + } else if (category == FILE_TYPE_IMAGE) { + service_add_extra_data(service, "View By", "By Folder"); + ret = service_set_uri(service, path); + } else { + ret = service_set_uri(service, path); + } + + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_uri()... [0x%x]", ret); + goto END; + } + ret = service_set_operation(service, SERVICE_OPERATION_VIEW); + if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_set_operation()... [0x%x]", ret); + goto END; + } + ret = service_send_launch_request(service, result_cb, NULL); + if (ret == SERVICE_ERROR_APP_NOT_FOUND) { + mf_popup_create_popup(data, POPMODE_TEXT, NULL, GET_SYS_STR(MF_LABEL_NO_APP), NULL, NULL, NULL, NULL, NULL); + } else if (ret != SERVICE_ERROR_NONE) { + mf_debug("service_send_launch_request()... [0x%x]", ret); + } else { + mf_util_set_recent_file(path); + mf_debug("service_send_launch_request()... [0x%x]", ret); + } + +END: + if (service) { + service_destroy(service); + } + return LAUNCH_TYPE_FORK; + +} + diff --git a/src/common/mf-log.c b/src/common/mf-log.c new file mode 100644 index 0000000..6dfb302 --- /dev/null +++ b/src/common/mf-log.c @@ -0,0 +1,80 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifdef MYFILE_CRITICAL_LOG +#include +#include +#include +#include +#include +#include + +#include "mf-log.h" +#include "mf-dlog.h" +#include "mf-util.h" + +static FILE *g_fp = NULL; + +int mf_log_init() +{ + pid_t process_id = 0; + process_id = getpid(); + + char *result_file = g_strdup_printf("%s-%d", MF_LOG_RESULT_FILE, (int)process_id); + if (result_file == NULL) + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + + g_fp = fopen(result_file, "at+"); + + if(g_fp == NULL) { + free(result_file); + return MYFILE_ERR_FILE_OPEN_FAIL; + } + + free(result_file); + return MYFILE_ERR_NONE; +} +void mf_log_finalize() +{ + if (g_fp != NULL) { + fclose(g_fp); + g_fp = NULL; + } + +} + +int mf_log_record(char *filename, const char *function, int line, char *fmt, ...) +{ + if (g_fp == NULL) + return MYFILE_ERR_INVALID_ARG; + + char *message = NULL; + va_list arg_ptr; + va_start(arg_ptr, fmt); + message = g_strdup_vprintf(fmt, arg_ptr); + va_end(arg_ptr); + + fprintf(g_fp, MF_LOG_FORMAT, filename, function, line, message); + if (message != NULL) { + free(message); + message = NULL; + } + + return MYFILE_ERR_NONE; +} +#endif diff --git a/src/common/mf-media-content.c b/src/common/mf-media-content.c new file mode 100644 index 0000000..9a7581e --- /dev/null +++ b/src/common/mf-media-content.c @@ -0,0 +1,161 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include "mf-dlog.h" +#include "mf-util.h" +#include "mf-media-content.h" + +mf_condition_s *mf_media_content_condition_create(const char *condition) +{ + mf_condition_s *filter = NULL; + + filter = (mf_condition_s *)calloc(1, sizeof(mf_condition_s)); + + if (filter == NULL) { + return NULL; + } + + memset(filter, 0, sizeof(mf_condition_s)); + + mf_debug("condition [%s]", condition); + filter->cond = condition; + filter->collate_type = MEDIA_CONTENT_COLLATE_DEFAULT; + filter->sort_type = MEDIA_CONTENT_ORDER_DESC; + filter->sort_keyword = MEDIA_MODIFIED_TIME; + filter->with_meta = true; + + return filter; +} + +void mf_media_conte_free_condition(mf_condition_s **condition) +{ + mf_retm_if(condition == NULL, "condition is NULL"); + if (*condition) { + SAFE_FREE_CHAR((*condition)->cond); + SAFE_FREE_CHAR(*condition); + } +} + +int mf_media_content_create_filter(filter_h *filter, mf_condition_s *condition) +{ + mf_retvm_if(filter == NULL, -1, "filter is NULL"); + mf_retvm_if(condition == NULL, -1, "condition is NULL"); + + int ret = MEDIA_CONTENT_ERROR_NONE; + filter_h tmp_filter = NULL; + ret = media_filter_create(&tmp_filter); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + mf_debug("Fail to create filter"); + return ret; + } + if (condition->cond) { + ret = media_filter_set_condition(tmp_filter, condition->cond, + condition->collate_type); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + mf_debug("Fail to set condition"); + goto ERROR; + } + } + + if (condition->sort_keyword) { + ret = media_filter_set_order(tmp_filter, condition->sort_type, + condition->sort_keyword, + condition->collate_type); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + mf_debug("Fail to set order"); + goto ERROR; + } + } + + mf_debug("offset is %d, count is %d", condition->offset, condition->count); + if (condition->offset != -1 && condition->count != -1 && + condition->count > condition->offset) { + ret = media_filter_set_offset(tmp_filter, condition->offset, + condition->count); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + mf_debug("Fail to set offset"); + goto ERROR; + } + } + *filter = tmp_filter; + return ret; + ERROR: + if (tmp_filter) { + media_filter_destroy(tmp_filter); + tmp_filter = NULL; + } + return ret; +} + +int mf_media_content_destroy_filter(filter_h filter) +{ + mf_retvm_if(filter == NULL, -1, "filter is NULL"); + int ret = MEDIA_CONTENT_ERROR_NONE; + ret = media_filter_destroy(filter); + + return ret; +} + +int mf_media_content_data_get(void *data, char *condition, bool (*func) (media_info_h media, void *data)) +{ + + mf_condition_s *temp_condition = NULL; + filter_h filter = NULL; + temp_condition = mf_media_content_condition_create(condition); + + int ret = -1; + ret = mf_media_content_create_filter(&filter, temp_condition); + + if (ret != 0) { + mf_debug("Create filter failed"); + mf_media_conte_free_condition(&temp_condition); + return ret; + } + + + ret = media_info_foreach_media_from_db(filter, + (media_info_cb)func, + data); + if (ret != 0) { + mf_debug("media_info_foreach_media_from_db failed: %d", ret); + } else { + mf_debug("media_info_foreach_media_from_db success!", ret); + } + + mf_media_content_destroy_filter(filter); + mf_media_conte_free_condition(&temp_condition); + + return ret; + +} + +void mf_media_content_scan_file(const char *path) +{ + mf_retm_if(path == NULL, "path is NULL"); + + media_content_scan_file(path); +} + +void mf_media_content_scan_folder(const char *path) +{ + mf_retm_if(path == NULL, "path is NULL"); + + media_content_scan_folder(path, false, NULL, NULL); +} + diff --git a/src/common/mf-otg.c b/src/common/mf-otg.c new file mode 100644 index 0000000..9ba106c --- /dev/null +++ b/src/common/mf-otg.c @@ -0,0 +1,685 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifdef MYFILE_USB_OTG +#include "mf-main.h" +#include "mf-otg.h" +#include "mf-widget.h" +#include "mf-fs-util.h" +#include "mf-fm-svc-wrapper.h" + +void mf_otg_list_clean(void *data, mf_otg_list_e list_type) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + switch (list_type) { + case MF_OTG_LIST_DEV: + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + free(((mf_otg_node *)node)->name); + ((mf_otg_node *)node)->name = NULL; + } + } + + if (ap->mf_FileOperation.otg_dev_list) { + eina_list_free(ap->mf_FileOperation.otg_dev_list); + ap->mf_FileOperation.otg_dev_list = NULL; + } + break; + case MF_OTG_LIST_REMOVED: + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_removed_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + free(((mf_otg_node *)node)->name); + ((mf_otg_node *)node)->name = NULL; + } + } + + eina_list_free(ap->mf_FileOperation.otg_dev_removed_list); + ap->mf_FileOperation.otg_dev_removed_list = NULL; + break; + default: + break; + } +} + +int mf_otg_init(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_FileOperation.otg_dev_list != NULL) + mf_otg_list_clean(ap, MF_OTG_LIST_DEV); + + if(ap->mf_FileOperation.otg_dev_removed_list != NULL) + mf_otg_list_clean(ap, MF_OTG_LIST_REMOVED); + + DIR *pDir = NULL; + struct dirent *ent; + pDir = opendir(OTG_FOLDER); + + if (pDir == NULL) { + return MYFILE_ERR_DIR_OPEN_FAIL; + } + + while ((ent = readdir(pDir)) != NULL) { + mf_otg_node *pNode = NULL; + + if (g_strcmp0(ent->d_name, ".") == 0 || g_strcmp0(ent->d_name, "..") == 0) { + continue; + } + + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + continue; + } + + pNode = (mf_otg_node *) malloc(sizeof(mf_otg_node)); + + if (pNode == NULL) { + continue; + } + memset(pNode, 0, sizeof(mf_otg_node)); + /* set name */ + pNode->name = g_strconcat(OTG_FOLDER, "/", ent->d_name, NULL); + /* set flag */ + pNode->flag_using = false; + pNode->flag_editstart = false; + + ap->mf_FileOperation.otg_dev_list = eina_list_append(ap->mf_FileOperation.otg_dev_list, pNode); + } + closedir(pDir); + return MYFILE_ERR_NONE; +} + +bool mf_otg_is_in_list(void *data, const char *dev_name) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if (node && g_strcmp0(((mf_otg_node *)node)->name, dev_name) == 0) + return true; + } + return false; +} + +int mf_otg_insert_node(void *data, const char *name) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (mf_otg_is_in_list(ap, name)) { + return MYFILE_ERR_NONE; + } else { + mf_otg_node *pNode = NULL; + pNode = (mf_otg_node *)malloc(sizeof(mf_otg_node)); + + if (pNode == NULL) { + return MYFILE_ERR_ALLOCATE_MEMORY_FAIL; + } + memset(pNode, 0, sizeof(mf_otg_node)); + + /* set name */ + pNode->name = g_strdup(name); + /* set flag */ + pNode->flag_using = false; + pNode->flag_editstart = false; + + ap->mf_FileOperation.otg_dev_list = eina_list_append(ap->mf_FileOperation.otg_dev_list, pNode); + } + return MYFILE_ERR_NONE; +} +int mf_otg_delete_node(void *data, const char *name) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (!mf_otg_is_in_list(ap, name)) { + mf_debug(); + return MYFILE_ERR_NONE; + } else { + Eina_List *l = NULL; + void *node = NULL; + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (g_strcmp0(((mf_otg_node *)node)->name, name) == 0){ + free(((mf_otg_node *)node)->name); + ((mf_otg_node *)node)->name = NULL; + } + ap->mf_FileOperation.otg_dev_list = eina_list_remove_list(ap->mf_FileOperation.otg_dev_list, l); + break; + } + } + } + return MYFILE_ERR_NONE; +} + +/* + * flag_inc_dec: + * true: insert node + * false: delete node +*/ +int mf_otg_list_update(void *data, bool flag_inc_dec) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + mf_debug(); + if (flag_inc_dec == TRUE) { + DIR *pDir = NULL; + struct dirent *ent; + pDir = opendir(OTG_FOLDER); + + if (pDir == NULL) { + return MYFILE_ERR_DIR_OPEN_FAIL; + } + + while ((ent = readdir(pDir)) != NULL) { + if (g_strcmp0(ent->d_name, ".") == 0 || g_strcmp0(ent->d_name, "..") == 0) { + continue; + } + + if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0) { + mf_debug(); + continue; + } + + mf_debug(); + char *test_name = g_strconcat(OTG_FOLDER, "/", ent->d_name, NULL); + mf_debug("current test_name is %s", test_name); + if (test_name != NULL) { + mf_debug(); + /*we will check if the device is already in the list in mf_otg_insert_node*/ + if (flag_inc_dec == true) { + mf_otg_insert_node(ap, test_name); + mf_debug(); + } + + free(test_name); + test_name = NULL; + } + } + closedir(pDir); + } else { + Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + mf_debug("name is %s", ((mf_otg_node *)node)->name); + if (ecore_file_exists(((mf_otg_node *)node)->name) == false) + mf_otg_delete_node(ap, ((mf_otg_node *)node)->name); + } + } + } + return MYFILE_ERR_NONE; +} + +bool mf_otg_is_empty(void *data) +{ + return ecore_file_exists(OTG_FOLDER) && ecore_file_dir_is_empty(OTG_FOLDER); +} + +char *mf_otg_get_node_in_use(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL) { + if (((mf_otg_node *)node)->flag_using == true) { + return ((mf_otg_node *)node)->name; + } + } + } + return NULL; +} + +void mf_otg_set_node_using_flag(void *data, char *dev_name, bool status) +{ + assert(data); + /*g_strcmp0 used, no need to check dev_name here*/ + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + mf_debug("dev_name is %s", dev_name); + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (g_strcmp0(((mf_otg_node *)node)->name, dev_name) == 0) { + ((mf_otg_node *)node)->flag_using = status; + } + } + } +} + +int mf_otg_get_node_using_flag(void *data, char *dev_name, bool *status) +{ + assert(data); + assert(status); + /*g_strcmp0 used, no need to check dev_name here*/ + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (g_strcmp0(((mf_otg_node *)node)->name, dev_name) == 0) { + *status = ((mf_otg_node *)node)->flag_using; + return MYFILE_ERR_NONE; + } + } + } + return MYFILE_ERR_GET_STAT_FAIL; +} + +void mf_otg_set_node_editstart_flag(void *data, char *dev_name, bool status) +{ + assert(data); + /*g_strcmp0 used, no need to check dev_name here*/ + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + mf_debug("dev_name is %s", dev_name); + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (g_strcmp0(((mf_otg_node *)node)->name, dev_name) == 0) { + ((mf_otg_node *)node)->flag_editstart = status; + } + } + } +} + +int mf_otg_get_node_editstart_flag(void *data, char *dev_name, bool *status) +{ + assert(data); + assert(status); + /*g_strcmp0 used, no need to check dev_name here*/ + struct appdata *ap = (struct appdata *)data; + + Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (g_strcmp0(((mf_otg_node *)node)->name, dev_name) == 0) { + *status = ((mf_otg_node *)node)->flag_editstart; + return MYFILE_ERR_NONE; + } + } + } + return MYFILE_ERR_GET_STAT_FAIL; +} + +void mf_otg_generate_removed_list(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_FileOperation.otg_dev_removed_list != NULL) { + mf_debug(); + mf_otg_list_clean(ap, MF_OTG_LIST_REMOVED); + } + Eina_List *l = NULL; + void *node = NULL; + + mf_otg_node *pNode = NULL; + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (ecore_file_exists(((mf_otg_node *)node)->name) == false) { + pNode = (mf_otg_node *) malloc(sizeof(mf_otg_node)); + + if (pNode == NULL) { + continue; + } + memset(pNode, 0, sizeof(mf_otg_node)); + /* set name */ + pNode->name = g_strdup(((mf_otg_node *)node)->name); + /* set flag */ + pNode->flag_using = ((mf_otg_node *)node)->flag_using; + pNode->flag_editstart = ((mf_otg_node *)node)->flag_editstart; + + ap->mf_FileOperation.otg_dev_removed_list = eina_list_append(ap->mf_FileOperation.otg_dev_removed_list, pNode); + } + } + + } +} + +void mf_otg_clear_removed_device(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + const Eina_List *l = NULL; + void *node = NULL; + + EINA_LIST_FOREACH(ap->mf_FileOperation.otg_dev_list, l, node) { + if ((mf_otg_node *)node != NULL && ((mf_otg_node *)node)->name != NULL) { + if (ecore_file_exists(((mf_otg_node *)node)->name) == false) { + mf_otg_delete_node(ap, ((mf_otg_node *)node)->name); + } + } + } +} + +/*do external operation according to the opt*/ +static void __mf_otg_dev_removed_ex_operation(void *data, mf_otg_ex_opt_e opt) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + /* try to remove all the popup and give an notice popup */ + if (opt & MF_OTG_OPT_REQ_POPUP_DEL) { /*delete request popup in data transmit period*/ + ap->mf_MainWindow.pMmcRemovedPopup = mf_popup_create_popup(ap, POPMODE_TEXT_NOT_DISABLED, NULL, + "OTG device removed...", NULL, NULL, NULL, NULL, NULL); + } + + if (opt & MF_OTG_OPT_NOR_POPUP_DEL) { /*delete normal popup*/ + if (ap->mf_MainWindow.pNormalPopup) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + } + } + +} + +void mf_otg_dev_all_removed_update(void *data, mf_otg_ex_opt_e opt) +{ + mf_debug(); + assert(data); + struct appdata *ap = (struct appdata *)data; + + mf_debug(); + Evas_Object *entry = NULL; + myfileNaviBar *pNaviToShowStruct = NULL; + myfileNaviBar *pNaviOTG = NULL; + Evas_Object *pNaviBarStorageView = NULL; + + /*otg tab destroyed, finalize otg*/ + mf_otg_finalize(ap); + + MF_STORAGE optStorage = MYFILE_OTG; + + pNaviBarStorageView = ap->mf_MainWindow.pNaviBar; + pNaviOTG = mf_navi_bar_get_struct_by_label(ap, GET_STR(MF_LABEL_OTG)); + + char status = MF_OTG_STATUS_NONE; + + if (pNaviOTG != NULL && pNaviOTG->naviFlagEditStart == TRUE) + status |= MF_OTG_STATUS_EDIT; + + if (pNaviOTG != NULL && pNaviOTG->naviFlagInUse == TRUE) + status |= MF_OTG_STATUS_USING; + + /*destroy otg navi bar*/ + mf_debug("navi count is %d", eina_list_count(ap->mf_MainWindow.plistNaviBar)); + mf_navi_bar_remove_list_item_by_label(ap, GET_STR(MF_LABEL_OTG)); + mf_debug(); + + if (status & MF_OTG_STATUS_EDIT) { + mf_navi_bar_recover_list(ap); + } + + pNaviToShowStruct = mf_navi_bar_get_struct_by_label(ap, GET_SYS_STR(MF_LABEL_PHONE)); + + if (ap->mf_Status.view_type == mf_view_root) { + mf_callback_storage_remove_view_operation(ap, optStorage); + if (status & MF_OTG_STATUS_EDIT) { + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } else if (status & MF_OTG_STATUS_USING){ + if ( ap->mf_Status.more == MORE_CREATE_FOLDER + && (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.preMore == MORE_INTERNAL_COPY || ap->mf_Status.preMore == MORE_INTERNAL_MOVE)) { + ap->mf_Status.more = ap->mf_Status.preMore; + } else if (ap->mf_Status.more != MORE_INTERNAL_COPY_MOVE && ap->mf_Status.preMore != MORE_INTERNAL_COPY && ap->mf_Status.preMore != MORE_INTERNAL_MOVE) { + ap->mf_Status.more = MORE_DEFAULT; + } + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } + } else if (ap->mf_Status.view_type == mf_view_root_category) { + mf_callback_storage_remove_category_view_items(ap, optStorage); + } else { + if (status & MF_OTG_STATUS_EDIT) { + ap->mf_Status.more = MORE_DEFAULT; + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } else if (status & MF_OTG_STATUS_USING){ + if ( ap->mf_Status.more == MORE_CREATE_FOLDER + && (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.preMore == MORE_INTERNAL_COPY || ap->mf_Status.preMore == MORE_INTERNAL_MOVE)) { + ap->mf_Status.more = ap->mf_Status.preMore; + } else if (ap->mf_Status.more != MORE_INTERNAL_COPY_MOVE && ap->mf_Status.preMore != MORE_INTERNAL_COPY && ap->mf_Status.preMore != MORE_INTERNAL_MOVE) { + ap->mf_Status.more = MORE_DEFAULT; + } + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } + + } + + /*delete external storage from tab bar*/ + mf_debug("navi count is %d", eina_list_count(ap->mf_MainWindow.plistNaviBar)); + /*check tab bar item to decide if delete tab bar*/ + mf_debug("navi count is %d", eina_list_count(ap->mf_MainWindow.plistNaviBar)); + + /*clear some external detail after remove otg device*/ + mf_debug(); + if (status) { + __mf_otg_dev_removed_ex_operation(ap, opt); + } else { + mf_otg_ex_opt_e updated_opt = opt; + if (updated_opt & MF_OTG_OPT_NOR_POPUP_DEL) + updated_opt ^= MF_OTG_OPT_NOR_POPUP_DEL; + + if (updated_opt & MF_OTG_OPT_REQ_POPUP_DEL) + updated_opt ^= MF_OTG_OPT_REQ_POPUP_DEL; + + __mf_otg_dev_removed_ex_operation(ap, updated_opt); + } + + if (ap->mf_Status.more == MORE_RENAME) { + entry = ap->mf_MainWindow.pEntry; + if (entry != NULL) { + elm_object_focus_set(entry, EINA_TRUE); + } + } +} + +void mf_otg_dev_removed_update(void *data, mf_otg_ex_opt_e opt) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + Evas_Object *pNaviBarStorageView = NULL; + myfileNaviBar *pNavi_s = NULL; + myfileNaviBar *pNaviToShowStruct = NULL; + + pNaviBarStorageView = ap->mf_MainWindow.pNaviBar; + pNavi_s = mf_navi_bar_get_struct_by_label(ap, GET_STR(MF_LABEL_OTG)); + if (pNavi_s == NULL) { + return; + } + Eina_List *l = NULL; + void *node = NULL; + + int error_code = 0; + char status = MF_OTG_STATUS_NONE; + EINA_LIST_FOREACH (ap->mf_FileOperation.otg_dev_removed_list, l, node) { + if (node) { + bool using_status = FALSE; + error_code = mf_otg_get_node_using_flag(ap, ((mf_otg_node *)node)->name, &using_status); + if (error_code == 0 && using_status == TRUE) + status |= MF_OTG_STATUS_USING; + bool edit_status = FALSE; + error_code = mf_otg_get_node_editstart_flag(ap, ((mf_otg_node *)node)->name, &edit_status); + if (error_code == 0 && edit_status == TRUE) + status |= MF_OTG_STATUS_EDIT; + } + } + + /*check both flags*/ + mf_debug("status is %d", status); + mf_debug("status & MF_OTG_STATUS_EDIT is %d", status & MF_OTG_STATUS_EDIT); + + if (status & MF_OTG_STATUS_EDIT) { + mf_debug(); + /*pop edit related view for each navi bar*/ + pNaviToShowStruct = mf_navi_bar_recover_list(ap); + + /*pop to the root view of OTG*/ + Elm_Object_Item *bottom_it = elm_naviframe_bottom_item_get(pNaviBarStorageView); + + elm_naviframe_item_pop_to(bottom_it); + + /* set the navi's currentpath to be root path*/ + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + } + pNavi_s->pCurrentPath = g_strdup(OTG_FOLDER); + ap->mf_MainWindow.pNaviLayout = ap->mf_Otg.rootpath_layout; + ap->mf_MainWindow.pNaviBox = ap->mf_Otg.rootpath_box; + + if (pNavi_s->naviFlagInUse == TRUE){ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + } + ap->mf_Status.path = g_string_new(OTG_FOLDER); + } + }else if (status & MF_OTG_STATUS_USING) { + if (ap->mf_Status.more == MORE_SEARCH) { + if (ap->mf_FileOperation.sync_pipe != NULL) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + + if (ap->mf_Status.search_handler > 0) { + mf_search_stop(ap->mf_Status.search_handler); + } + + if (ap->mf_Status.search_handler > 0) { + mf_search_finalize(&ap->mf_Status.search_handler); + } + } + if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || (ap->mf_Status.more == MORE_CREATE_FOLDER && (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE))) { + /*pop unused path select view*/ + /*create and push root view of OTG*/ + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(OTG_FOLDER); + + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = g_strdup(OTG_FOLDER); + + if (ap->mf_Status.more == MORE_CREATE_FOLDER) + ap->mf_Status.more = ap->mf_Status.preMore; + + mf_navi_bar_create_path_select_view_otg_root(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else { + ap->mf_Status.more = MORE_DEFAULT; + + /*pop to the root view of OTG*/ + Elm_Object_Item *bottom_it = elm_naviframe_bottom_item_get(pNaviBarStorageView); + + elm_naviframe_item_pop_to(bottom_it); + + /* set the navi's currentpath to be root path*/ + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + } + pNavi_s->pCurrentPath = g_strdup(OTG_FOLDER); + ap->mf_MainWindow.pNaviLayout = ap->mf_Otg.rootpath_layout; + ap->mf_MainWindow.pNaviBox = ap->mf_Otg.rootpath_box; + ap->mf_MainWindow.pNaviItem = ap->mf_Otg.rootpath_navi_item; + + if (pNavi_s->naviFlagInUse == TRUE){ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + } + ap->mf_Status.path = g_string_new(OTG_FOLDER); + } + } + } + + if ((status & MF_OTG_STATUS_EDIT) + || (pNavi_s && pNavi_s->naviFlagInUse && ((status & MF_OTG_STATUS_USING) || mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str) == MYFILE_OTG))) { + mf_debug("status is %d", status); + /*refresh the list*/ + mf_debug("status & MF_OTG_STATUS_EDIT is %d", status & MF_OTG_STATUS_EDIT); + if (status & MF_OTG_STATUS_USING) { + mf_debug(); + pNaviToShowStruct = pNavi_s; + + if ( ap->mf_Status.more == MORE_CREATE_FOLDER && (ap->mf_Status.preMore == MORE_INTERNAL_COPY_MOVE + || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE)) { + ap->mf_Status.more = ap->mf_Status.preMore; + } else if (ap->mf_Status.more != MORE_INTERNAL_COPY_MOVE && ap->mf_Status.more != MORE_INTERNAL_COPY && ap->mf_Status.more != MORE_INTERNAL_MOVE) { + ap->mf_Status.more = MORE_DEFAULT; + } + } + mf_navi_bar_refresh_recovered_view(ap, pNaviToShowStruct); + } + + /*clear some external detail after remove otg device*/ + mf_debug(); + if (status) { + __mf_otg_dev_removed_ex_operation(ap, opt); + } else { + mf_otg_ex_opt_e updated_opt = opt; + if (updated_opt & MF_OTG_OPT_NOR_POPUP_DEL) + updated_opt ^= MF_OTG_OPT_NOR_POPUP_DEL; + + if (updated_opt & MF_OTG_OPT_REQ_POPUP_DEL) + updated_opt ^= MF_OTG_OPT_REQ_POPUP_DEL; + + __mf_otg_dev_removed_ex_operation(ap, updated_opt); + } + mf_debug("dev list count is %d", eina_list_count(ap->mf_FileOperation.otg_dev_list)); + mf_otg_list_update(ap, FALSE); + mf_debug("dev list count is %d", eina_list_count(ap->mf_FileOperation.otg_dev_list)); + +} +void mf_otg_finalize(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + + mf_otg_list_clean(ap, MF_OTG_LIST_DEV); + mf_otg_list_clean(ap, MF_OTG_LIST_REMOVED); +} + +#endif diff --git a/src/common/mf-s-beam.c b/src/common/mf-s-beam.c new file mode 100644 index 0000000..c2567da --- /dev/null +++ b/src/common/mf-s-beam.c @@ -0,0 +1,263 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include + +#include "mf-s-beam.h" +#include "mf-dlog.h" +#include "mf-util.h" + +#define S_BEAM_SEPERATOR "|" + +typedef struct { + bool initialized; + bool enabled; + + Mf_Sbeam_Cb callback; + void *user_data; +} mf_sbeam_s; + +static mf_sbeam_s *g_sbeam_data = NULL; + +bool __mf_sbeam_is_on() +{ + bool ready = false; + + int value = 0; + if (vconf_get_bool(VCONFKEY_NFC_SBEAM, &value) == 0) { + if (value == VCONFKEY_NFC_SBEAM_ON) + ready = true; + else + mf_debug("sbeam is off"); + } else { + mf_error("vconf_get_int()"); + } + + return ready; +} + +static void +__mf_sbeam_target_discovered_cb(nfc_discovered_type_e type, nfc_p2p_target_h target, void *user_data) +{ + MF_TRACE_BEGIN; + MF_CHECK(g_sbeam_data); + MF_CHECK(g_sbeam_data->enabled); + + if (type == NFC_DISCOVERED_TYPE_ATTACHED && g_sbeam_data->callback) + { + mf_debug("NFC_DISCOVERED_TYPE_ATTACHED"); + g_sbeam_data->callback(g_sbeam_data->user_data); + } + else if (type == NFC_DISCOVERED_TYPE_DETACHED) + { + mf_debug("NFC_DISCOVERED_TYPE_DETACHED"); + } +} + + +static bool +__mf_sbeam_nfc_mgr_init() +{ + MF_CHECK_FALSE(g_sbeam_data); + + int ret = 0; + if (!g_sbeam_data->initialized) { + ret = nfc_manager_initialize(NULL, NULL); + if (ret == NFC_ERROR_NONE) { + mf_debug("NFC initializing is success. activating"); + g_sbeam_data->initialized = true; + } else { + mf_error("nfc_manager_initialize().. [0x%x]"); + return false; + } + } + + ret = nfc_manager_set_p2p_target_discovered_cb(__mf_sbeam_target_discovered_cb, g_sbeam_data); + if (ret != NFC_ERROR_NONE) { + mf_debug("nfc_manager_set_p2p_target_discovered_cb()..[0x%x]", ret); + return false; + } + + return true; +} + +static bool +__mf_sbeam_nfc_mgr_deinit() +{ + MF_CHECK_FALSE(g_sbeam_data); + + int ret = 0; + if (g_sbeam_data->initialized) { + ret = nfc_manager_deinitialize(); + if (ret != NFC_ERROR_NONE) { + mf_error("nfc_manager_deinitialize().. [0x%x]", ret); + return false; + } + g_sbeam_data->initialized = false; + } + + return true; +} + +static void +__mf_sbeam_state_changed_cb(keynode_t *node, void *user_data) +{ + MF_TRACE_BEGIN; + mf_sbeam_s *sbeam_data = user_data; + MF_CHECK(sbeam_data); + + if (__mf_sbeam_is_on() && sbeam_data->enabled) + __mf_sbeam_nfc_mgr_init(); + else + __mf_sbeam_nfc_mgr_deinit(); +} + +bool +mf_sbeam_init() +{ + MF_TRACE_BEGIN; + g_sbeam_data = calloc(1, sizeof(mf_sbeam_s)); + MF_CHECK_VAL(g_sbeam_data, false); + + if (vconf_notify_key_changed(VCONFKEY_NFC_SBEAM, __mf_sbeam_state_changed_cb, g_sbeam_data) < 0) { + mf_error("fail to vconf_notify_key_changed()"); + mf_sbeam_finalize(); + return false; + } + + if (__mf_sbeam_is_on()) + mf_sbeam_enable(); + + return true; +} + +void +mf_sbeam_finalize() +{ + MF_TRACE_BEGIN; + mf_sbeam_disable(); + SAFE_FREE_CHAR(g_sbeam_data); +} + +bool +mf_sbeam_enable() +{ + MF_TRACE_BEGIN; + MF_CHECK_FALSE(g_sbeam_data); + + g_sbeam_data->enabled = true; + + return __mf_sbeam_nfc_mgr_init(); +} +bool mf_sbeam_disable() +{ + MF_TRACE_BEGIN; + MF_CHECK_FALSE(g_sbeam_data); + + g_sbeam_data->enabled = false; + + return __mf_sbeam_nfc_mgr_deinit(); +} + +bool mf_sbeam_set_callback(Mf_Sbeam_Cb callback, void *user_data) +{ + MF_TRACE_BEGIN; + MF_CHECK_FALSE(g_sbeam_data); + + g_sbeam_data->callback = callback; + g_sbeam_data->user_data = user_data; + + return true; +} + +bool mf_sbeam_share_files(Evas_Object *win, Eina_List *file_list) +{ + MF_CHECK_FALSE(win); + + int ret = 0; + service_h svc_handle; + ret = service_create(&svc_handle); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_create().. [0x%x]", ret); + goto exception; + } + + ret = service_set_operation(svc_handle, "http://tizen.org/appcontrol/operation/nfc_sbeam_send"); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_set_operation().. [0x%x]", ret); + goto exception; + } + + ret = service_set_mime(svc_handle, "text/DirectShareFile"); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_set_mime().. [0x%x]", ret); + goto exception; + } + ret = service_set_window(svc_handle, elm_win_xwindow_get(win)); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_set_window().. [0x%x]", ret); + goto exception; + } + + char *uri = NULL; + if (file_list) { + Eina_List *current = file_list; + Eina_List *l = NULL; + GString *pNode = NULL; + + + EINA_LIST_FOREACH(current, l, pNode) { + if (pNode != NULL) { + if (uri == NULL) { + uri = g_strconcat(pNode->str, NULL); + } else { + gchar *temp = uri; + uri = g_strconcat(uri, S_BEAM_SEPERATOR, pNode->str, NULL); + g_free(temp); + } + } + + } + } + mf_debug("files = [%s]", uri); + ret = service_set_uri(svc_handle, uri); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_set_uri().. [0x%x]", ret); + goto exception; + } + SAFE_FREE_CHAR(uri); + + + ret = service_send_launch_request(svc_handle, NULL, NULL); + if (ret != SERVICE_ERROR_NONE) { + mf_error("service_send_launch_request().. [0x%x]", ret); + goto exception; + } + + service_destroy(svc_handle); + + return true; + +exception: + service_destroy(svc_handle); + svc_handle = NULL; + + return false; +} + diff --git a/src/common/mf-sensor.c b/src/common/mf-sensor.c new file mode 100644 index 0000000..c1d35b3 --- /dev/null +++ b/src/common/mf-sensor.c @@ -0,0 +1,148 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "mf-sensor.h" +#include "mf-dlog.h" +#include + +static sensor_h g_sensor; + +int mf_sensor_init(void) +{ + int res = SENSOR_ERROR_NONE; + bool doubletap = 0; + + res = sensor_is_supported(SENSOR_MOTION_DOUBLETAP, &doubletap); + MF_CHECK_VAL(res == SENSOR_ERROR_NONE, res); + + if(!doubletap) + mf_error("sensor not supported. doubletap: %d", doubletap); + + if(doubletap) + { + res = sensor_create(&g_sensor); + if(res != SENSOR_ERROR_NONE) + mf_error("Fail sensor_create"); + } + else + mf_error("motion not supported"); + + return res; +} + +int mf_sensor_finalize(void) +{ + int res = SENSOR_ERROR_NONE; + MF_CHECK_VAL(g_sensor, -1); + res = sensor_destroy(g_sensor); + g_sensor = NULL; + + return res; +} + +int mf_sensor_start(mf_motion_type type) +{ + MF_CHECK_VAL(g_sensor, -1); + + int res = SENSOR_ERROR_NONE; + switch(type) + { + case MF_MOTION_FACEDOWN: + res = sensor_start(g_sensor, SENSOR_MOTION_FACEDOWN); + break; + case MF_MOTION_DOUBLETAP: + res = sensor_start(g_sensor, SENSOR_MOTION_DOUBLETAP); + break; + default: + mf_error("Invalid motion type: 0x%x", type); + } + + if(res != SENSOR_ERROR_NONE) + mf_error("Fail sensor_start: type: %d ", type); + + mf_debug("sensor started"); + return res; +} + +int mf_sensor_stop(mf_motion_type type) +{ + MF_CHECK_VAL(g_sensor, -1); + + int res = SENSOR_ERROR_NONE; + switch(type) + { + case MF_MOTION_FACEDOWN: + res = sensor_stop(g_sensor, SENSOR_MOTION_FACEDOWN); + break; + case MF_MOTION_DOUBLETAP: + res = sensor_stop(g_sensor, SENSOR_MOTION_DOUBLETAP); + break; + default: + mf_error("Invalid motion type: 0x%x", type); + } + + if(res != SENSOR_ERROR_NONE) + mf_error("Fail sensor_stop: type: %d ", type); + + mf_debug("sensor stopped"); + return res; +} + +int mf_sensor_set_callback(mf_motion_type type, mf_sensor_cb callback, void *user_data) +{ + MF_CHECK_VAL(g_sensor, -1); + + int res = SENSOR_ERROR_NONE; + switch(type) + { + case MF_MOTION_FACEDOWN: + res = sensor_motion_facedown_set_cb(g_sensor, callback, user_data); + break; + case MF_MOTION_DOUBLETAP: + res = sensor_motion_doubletap_set_cb(g_sensor, callback, user_data); + break; + default: + mf_error("Invalid motion type: 0x%x", type); + break; + } + if(res != SENSOR_ERROR_NONE) + mf_error("Error: set sensor callback res = 0x%x"); + return res; +} + +int mf_sensor_unset_callback(mf_motion_type type) +{ + MF_CHECK_VAL(g_sensor, -1); + + int res = SENSOR_ERROR_NONE; + switch(type) + { + case MF_MOTION_FACEDOWN: + res = sensor_motion_facedown_unset_cb(g_sensor); + break; + case MF_MOTION_DOUBLETAP: + res = sensor_motion_doubletap_unset_cb(g_sensor); + break; + default: + mf_error("Invalid motion type: 0x%x", type); + break; + } + if(res != SENSOR_ERROR_NONE) + mf_error("Error: set sensor callback res = 0x%x"); + return res; +} + diff --git a/src/common/mf-share.c b/src/common/mf-share.c new file mode 100644 index 0000000..ba3c61d --- /dev/null +++ b/src/common/mf-share.c @@ -0,0 +1,181 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +#include "mf-main.h" +#include "mf-widget.h" +#include "mf-util.h" +#include "mf-fs-util.h" +#include "mf-launch.h" +#include "mf-drm.h" +#include "mf-share.h" +#include "mf-resource.h" + + +int mf_share_mode_get(Eina_List * selected_list) +{ + mf_retvm_if(selected_list == NULL, -1, "selected_list is NULL"); + int file_mode = SHARE_FILE_MODE_NORMAL; + + Eina_List *l = NULL; + GString *pNode = NULL; + int image_count = 0; + int video_count = 0; + EINA_LIST_FOREACH(selected_list, l, pNode) { + if (pNode != NULL) { + char *file_path = pNode->str; + if (mf_file_attr_is_dir(file_path)) { + return 0; + } + + fsFileType category = FILE_TYPE_NONE; + + mf_file_attr_get_file_category(file_path, &category); + if (category == FILE_TYPE_IMAGE) { + image_count++; + if (image_count > 1) { + file_mode = file_mode | SHARE_FILE_MODE_MULTI_IMAGE; + } else { + file_mode = file_mode | SHARE_FILE_MODE_IMAGE; + } + } else if (category == FILE_TYPE_VIDEO) { + video_count++; + if (video_count > 1) { + file_mode = file_mode | SHARE_FILE_MODE_MULTI_VIDEO; + } else { + file_mode = file_mode | SHARE_FILE_MODE_VIDEO; + } + } else { + file_mode = file_mode | SHARE_FILE_MODE_OTHERS; + } + } + } + return file_mode; +} +static int __mf_share_get_selected_files(void *data, gchar ** selected_files, Eina_List * selected_list) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, -1, "ap is NULL"); + mf_retvm_if(selected_list == NULL, 0, "selected_list is NULL"); + mf_retvm_if(selected_files == NULL, -1, "selected_files is NULL"); + + int file_count = 0; + Eina_List *l = NULL; + gchar *message = NULL; + + { + GString *pNode = NULL; + EINA_LIST_FOREACH(selected_list, l, pNode) { + if (pNode != NULL) { + if (!mf_file_attr_is_dir(pNode->str) && mf_drm_is_drm_file(pNode->str) == 0) { + if (mf_drm_is_converted_fl(pNode->str) == 0) { + message = g_strconcat(GET_STR(MF_POPUP_MESSAGE_SEND_FAIL1), "
    ", ecore_file_file_get(pNode->str), + GET_STR(MF_POPUP_MESSAGE_SEND_FAIL2), NULL); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, + NULL, NULL, NULL, NULL, NULL); + + g_free(message); + message = NULL; + if (*selected_files != NULL) { + g_free(*selected_files); + *selected_files = NULL; + } + MF_TRACE_END; + return -1; + } + } else if (mf_file_attr_is_dir(pNode->str)) { + message = GET_STR(MF_POPUP_MESSAGE_SEND_FAIL3); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + + if (*selected_files != NULL) { + g_free(*selected_files); + *selected_files = NULL; + } + MF_TRACE_END; + return -1; + } + + if (*selected_files == NULL) { + *selected_files = g_strconcat(pNode->str, NULL); + file_count++; + } else { + gchar *temp = *selected_files; + if (ap->mf_Status.more == MORE_SENDVIABLUETOOTH + ) { + *selected_files = g_strconcat(*selected_files, "?", pNode->str, NULL); + file_count++; + } + else { + *selected_files = g_strconcat(*selected_files, "\n", pNode->str, NULL); + file_count++; + } + + g_free(temp); + } + } + } + } + MF_TRACE_END; + return file_count; +} + +void mf_share_launch_multi_file(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + gchar *myFilenames = NULL; + int number_of_files = 0; + char count_arg[20] = { 0, }; + const char *message = NULL; + Eina_List *select_list = NULL; + + { + select_list = ap->mf_FileRecordList.selected_files; + } + number_of_files = __mf_share_get_selected_files(ap, &myFilenames, select_list); + if (number_of_files < 0) { + MF_TRACE_END; + return; + } else if (number_of_files == 0) { + message = GET_SYS_STR(MF_LABEL_NOTHING_SELECTED); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + MF_TRACE_END; + return; + } else { + snprintf(count_arg, sizeof(count_arg), "%d", number_of_files); + if (ap->mf_Status.more == MORE_SENDVIABLUETOOTH) { + mf_debug("::::::::::Send via bluetooth:::::::::::::"); + mf_launch_load_ug(ap, myFilenames, MF_LOAD_UG_BLUETOOTH, count_arg); + } else if (ap->mf_Status.more == MORE_SENDVIAEMAIL) { + mf_debug("::::::::::Send via email::::::::::::: files is [%s]", myFilenames); + mf_launch_load_ug(ap, myFilenames, MF_LOAD_UG_EMAIL, count_arg); + } else if (ap->mf_Status.more == MORE_SENDVIAMESSAGE) { + mf_debug("::::::::::Send via message::::::::::::: files is [%s]", myFilenames); + mf_launch_load_ug(ap, myFilenames, MF_LOAD_UG_MESSAGE, count_arg); + } + + g_free(myFilenames); + } + MF_TRACE_END; +} + diff --git a/src/common/mf-ta.c b/src/common/mf-ta.c new file mode 100644 index 0000000..985b3b5 --- /dev/null +++ b/src/common/mf-ta.c @@ -0,0 +1,544 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mf-ta.h" + +static void __mf_ta_free_cps(void); +static int __mf_ta_get_cp_index(char *name); + +static void __mf_ta_free_accums(void); +static int __mf_ta_get_accum_index(char *name); + +mf_ta_checkpoint **mf_g_cps = NULL; +static int mf_g_cp_index = 0; + +mf_ta_accum_item **mf_g_accums = NULL; +static int mf_g_accum_index = 0; +static int mf_g_accum_longest_name = 0; +static unsigned long mf_g_accum_first_time = 0xFFFFFFFF; +static int mf_g_enable = 1; + +int mf_ta_init(void) +{ + if (mf_g_accums) + return 0; + + mf_g_cps = (mf_ta_checkpoint **) malloc(MF_TA_MAX_CHECKPOINT * sizeof(mf_ta_checkpoint *)); + if (!mf_g_cps) + return -1; + + mf_g_accums = (mf_ta_accum_item **) malloc(MF_TA_MAX_CHECKPOINT * sizeof(mf_ta_accum_item *)); + if (!mf_g_accums) + return -1; + + mf_g_accum_first_time = 0xFFFFFFFF; + + return 0; +} + +int mf_ta_release(void) +{ + if (!mf_g_accums) + return 0; + + __mf_ta_free_cps(); + __mf_ta_free_accums(); + + mf_g_accum_first_time = 0xFFFFFFFF; + + return 0; +} + +void mf_ta_set_enable(int enable) +{ + printf("MF_TA : setting enable to %d\n", enable); + mf_g_enable = enable; +} + +int mf_ta_get_numof_checkpoints() +{ + return mf_g_cp_index; +} + +char *mf_ta_fmt(const char *fmt, ...) +{ + static char ta_buf[512]; + va_list args; + + memset(ta_buf, '\0', 512); + + va_start(args, fmt); + vsnprintf(ta_buf, 512, fmt, args); + va_end(args); + + return ta_buf; +} + + +int mf_ta_add_checkpoint(char *name, int show, char *filename, int line) +{ + mf_ta_checkpoint *cp = NULL; + struct timeval t; + + if (!mf_g_enable) + return -1; + + if (!mf_g_accums) + return 0; + + if (mf_g_cp_index == MF_TA_MAX_CHECKPOINT) + return -1; + + if (!name) + return -1; + + if (strlen(name) == 0) + return -1; + + cp = (mf_ta_checkpoint *) malloc(sizeof(mf_ta_checkpoint)); + if (!cp) + return -1; + + cp->name = (char *)malloc(strlen(name) + 1); + if (!cp->name) { + free(cp); + return -1; + } + strncpy(cp->name, name, strlen(name)); + + if (show) + printf("[CHECK-POINT] %s...(%s:%d)\n", name, filename, line); + + gettimeofday(&t, NULL); + cp->timestamp = t.tv_sec * 1000000L + t.tv_usec; +#ifdef MF_TA_UNIT_MSEC + cp->timestamp = (cp->timestamp >= 1000) ? cp->timestamp / 1000 : 0; +#endif + + mf_g_cps[mf_g_cp_index] = cp; + + mf_g_cp_index++; + + return 0; +} + +void mf_ta_show_checkpoints(void) +{ + int i = 0; + if (!mf_g_accums) + return; + + printf("BEGIN RESULT ============================\n"); + for (i = 0; i < mf_g_cp_index; i++) { + printf("[%d] %s : %ld us.\n", i, mf_g_cps[i]->name, mf_g_cps[i]->timestamp); + } + printf("END RESULT ============================\n"); +} + +void mf_ta_show_diff(char *name1, char *name2) +{ + if (!mf_g_accums) + return; + + + printf("Time takes from [%s] to [%s] : %ld us.\n", name1, name2, mf_ta_get_diff(name1, name2)); +} + +unsigned long mf_ta_get_diff(char *name1, char *name2) +{ + int cp1, cp2; + + if (!mf_g_accums) + return 0; + + + /* fail if bad param. */ + if (!name1 || !name2) + return -1; + + /* fail if same. */ + if (strcmp(name1, name2) == 0) + return -1; + + /*get index */ + if ((cp1 = __mf_ta_get_cp_index(name1)) == -1) + return -1; + + if ((cp2 = __mf_ta_get_cp_index(name2)) == -1) + return -1; + + /* NOTE : + * return value must be positive value. + * bcz the value of higher index of mf_g_cps always higher than lower one. + */ + return mf_g_cps[cp2]->timestamp - mf_g_cps[cp1]->timestamp; + +} + +static int __mf_ta_get_cp_index(char *name) +{ + int i; + + assert(name); + + /* find index */ + for (i = 0; i < mf_g_cp_index; i++) { + if (strcmp(name, mf_g_cps[i]->name) == 0) + return i; + } + + return -1; +} + +static int __mf_ta_get_accum_index(char *name) +{ + int i; + + assert(name); + + /* find index */ + for (i = 0; i < mf_g_accum_index; i++) { + if (strcmp(name, mf_g_accums[i]->name) == 0) + return i; + } + + return -1; +} + +static void __mf_ta_free_cps(void) +{ + int i = 0; + + if (!mf_g_cps) + return; + + for (i = 0; i < mf_g_cp_index; i++) { + if (mf_g_cps[i]) { + if (mf_g_cps[i]->name) + free(mf_g_cps[i]->name); + + free(mf_g_cps[i]); + + mf_g_cps[i] = NULL; + } + } + + free(mf_g_cps); + mf_g_cps = NULL; + + mf_g_cp_index = 0; +} + +static void __mf_ta_free_accums(void) +{ + int i = 0; + + if (!mf_g_accums) + return; + + for (i = 0; i < mf_g_accum_index; i++) { + if (mf_g_accums[i]) { + if (mf_g_accums[i]->name) + free(mf_g_accums[i]->name); + + free(mf_g_accums[i]); + + mf_g_accums[i] = NULL; + } + } + + mf_g_accum_index = 0; + mf_g_accum_longest_name = 0; + + free(mf_g_accums); + mf_g_accums = NULL; +} + + +int mf_ta_accum_item_begin(char *name, int show, char *filename, int line) +{ + mf_ta_accum_item *accum = NULL; + int index = 0; + int name_len = 0; + struct timeval t; + + if (!mf_g_enable) + return -1; + + if (!mf_g_accums) + return 0; + + + + if (mf_g_accum_index == MF_TA_MAX_ACCUM) + return -1; + + if (!name) + return -1; + + name_len = strlen(name); + if (name_len == 0) + return -1; + + /* if 'name' is new one. create new item. */ + if ((index = __mf_ta_get_accum_index(name)) == -1) { + accum = (mf_ta_accum_item *) malloc(sizeof(mf_ta_accum_item)); + if (!accum) + return -1; + + /*clear first. */ + memset(accum, 0, sizeof(mf_ta_accum_item)); + accum->elapsed_min = 0xFFFFFFFF; + + accum->name = (char *)malloc(name_len + 1); + if (!accum->name) { + free(accum); + return -1; + } + memset(accum->name, 0, name_len + 1); + strncpy(accum->name, name, strlen(name)); + + /* add it to list. */ + mf_g_accums[mf_g_accum_index] = accum; + mf_g_accum_index++; + + if (mf_g_accum_longest_name < name_len) + mf_g_accum_longest_name = name_len; + + } else { + accum = mf_g_accums[index]; + } + + /*verify pairs of begin, end. */ + if (accum->on_estimate) { + printf("[%s] is not 'end'ed!\n", accum->name); + accum->num_unpair++; + return -1; + } + /*get timestamp */ + gettimeofday(&t, NULL); + accum->timestamp = t.tv_sec * 1000000L + t.tv_usec; +#ifdef MF_TA_UNIT_MSEC + accum->timestamp = (accum->timestamp >= 1000) ? accum->timestamp / 1000 : 0; +#endif + accum->on_estimate = 1; + + if (accum->first_start == 0) { /* assum that timestamp never could be zero. */ + accum->first_start = accum->timestamp; + + if (mf_g_accum_first_time > accum->first_start) + mf_g_accum_first_time = accum->first_start; + } + + if (show) + printf("[ACCUM BEGIN] %s : %ld ---(%s:%d)\n", name, accum->timestamp, filename, line); + + accum->num_calls++; + + return 0; +} + +int mf_ta_accum_item_end(char *name, int show, char *filename, int line) +{ + mf_ta_accum_item *accum = NULL; + unsigned int tval = 0; + int index = 0; + struct timeval t; + + if (!mf_g_enable) + return -1; + + if (!mf_g_accums) + return 0; + + + /* get time first for more accuracy. */ + gettimeofday(&t, NULL); + + if (mf_g_accum_index == MF_TA_MAX_ACCUM) + return -1; + + if (!name) + return -1; + + if (strlen(name) == 0) + return -1; + + /* varify the 'name' is already exist. */ + if ((index = __mf_ta_get_accum_index(name)) == -1) { + printf("[%s] is not added before!\n", name); + return -1; + } + + accum = mf_g_accums[index]; + + /* verify pairs of begin, end. */ + if (!accum->on_estimate) { + printf("[%s] is not 'begin' yet!\n", accum->name); + accum->num_unpair++; + return -1; + } + /* get current timestamp. */ + tval = t.tv_sec * 1000000L + t.tv_usec; +#ifdef MF_TA_UNIT_MSEC + tval = (tval >= 1000) ? tval / 1000 : 0; +#endif + + /* update last_end */ + accum->last_end = tval; + + /* make get elapsed time. */ + tval = tval - accum->timestamp; + + /* update min/max */ + accum->elapsed_max = tval > accum->elapsed_max ? tval : accum->elapsed_max; + accum->elapsed_min = tval < accum->elapsed_min ? tval : accum->elapsed_min; + + if (show) + printf("[ACCUM END] %s : %ld + %u ---(%s:%d)\n", name, accum->elapsed_accum, tval, filename, line); + + /* add elapsed time */ + accum->elapsed_accum += tval; + accum->on_estimate = 0; + + return 0; +} + +void __mf_ta_print_some_info(FILE *fp) +{ + if (!fp) + return; + + /* comment */ + { + fprintf(fp, "\nb~ b~ b~\n\n"); + } + + /* General infomation */ + { + time_t t_val; + char hostname[MF_TA_BUFF_SIZE] = { '\0', }; + char buf[MF_TA_BUFF_SIZE] = {'\0', }; + struct utsname uts; + struct rusage r_usage; + + fprintf(fp, "\n[[ General info ]]\n"); + + /* time and date */ + time(&t_val); + ctime_r(&t_val, buf); + fprintf(fp, "Date : %s", buf); + + /* system */ + if (gethostname(hostname, 255) == 0 && uname(&uts) >= 0) { + fprintf(fp, "Hostname : %s\n", hostname); + fprintf(fp, "System : %s\n", uts.sysname); + fprintf(fp, "Machine : %s\n", uts.machine); + fprintf(fp, "Nodename : %s\n", uts.nodename); + fprintf(fp, "Release : %s \n", uts.release); + fprintf(fp, "Version : %s \n", uts.version); + } + /* process info. */ + fprintf(fp, "Process priority : %d\n", getpriority(PRIO_PROCESS, getpid())); + getrusage(RUSAGE_SELF, &r_usage); + fprintf(fp, "CPU usage : User = %ld.%06ld, System = %ld.%06ld\n", + r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec, r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec); + + + } + + /* host environment variables */ + { + extern char **environ; + char **env = environ; + + fprintf(fp, "\n[[ Host environment variables ]]\n"); + while (*env) { + fprintf(fp, "%s\n", *env); + env++; + } + } +} + +void mf_ta_show_accum_result(int direction) +{ + int i = 0; + char format[256]; + FILE *fp = stderr; + + if (!mf_g_accums) + return; + + switch (direction) { + case MF_TA_SHOW_STDOUT: + fp = stdout; + break; + case MF_TA_SHOW_STDERR: + fp = stderr; + break; + case MF_TA_SHOW_FILE: + { + fp = fopen(MF_TA_RESULT_FILE, "wt"); + if (!fp) + return; + } + } + __mf_ta_print_some_info(fp); + +#ifdef MF_TA_UNIT_MSEC + snprintf(format, sizeof(format), + "[%%3d] %%-%ds | \ttotal : %%4ld\tcalls : %%3ld\tavg : %%4ld\tmin : %%4ld\tmax : %%4ld\tstart : %%4lu\tend : %%4lu\tunpair : %%3ld\n", + mf_g_accum_longest_name); + fprintf(fp, "BEGIN RESULT ACCUM============================ : NumOfItems : %d, unit(msec)\n", mf_g_accum_index); +#else + snprintf(format, sizeof(format), + "[%%3d] %%-%ds : \ttotal : %%ld\t:calls : %%ld\t:avg : %%ld\tmin : %%ld\tmax : %%ld\tstart : %%lu\tend : %%lu\tunpair : %%ld\n", + mf_g_accum_longest_name); + fprintf(fp, "BEGIN RESULT ACCUM============================ : NumOfItems : %d, unit(usec)\n", mf_g_accum_index); +#endif + + for (i = 0; i < mf_g_accum_index; i++) { + /*prevent 'devide by zero' error */ + if (mf_g_accums[i]->num_calls == 0) + mf_g_accums[i]->num_calls = 1; + + fprintf(fp, format, i, mf_g_accums[i]->name, mf_g_accums[i]->elapsed_accum, mf_g_accums[i]->num_calls, + (mf_g_accums[i]->elapsed_accum == 0) ? 0 : (int)(mf_g_accums[i]->elapsed_accum / mf_g_accums[i]->num_calls), + mf_g_accums[i]->elapsed_min, + mf_g_accums[i]->elapsed_max, + mf_g_accums[i]->first_start - mf_g_accum_first_time, + mf_g_accums[i]->last_end - mf_g_accum_first_time, mf_g_accums[i]->num_unpair); + } + fprintf(fp, "END RESULT ACCUM ============================\n"); + + if (direction == MF_TA_SHOW_FILE) + fclose(fp); +} diff --git a/src/common/mf-util.c b/src/common/mf-util.c new file mode 100644 index 0000000..b4bace3 --- /dev/null +++ b/src/common/mf-util.c @@ -0,0 +1,1579 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + +#include +#include +#include +#include +#include +#include + + + +#include "mf-util.h" +#include "mf-widget.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-fs-util.h" +#include "mf-copy.h" +#include "mf-resource.h" + +#ifndef VCONFKEY_MYFILE_LIST_BY +#define VCONFKEY_MYFILE_LIST_BY "db/private/org.tizen.myfile/list_by" +#endif + +#ifndef VCONFKEY_MYFILE_VIEW_STYLE +#define VCONFKEY_MYFILE_VIEW_STYLE "db/private/org.tizen.myfile/view_style" +#endif + +#ifndef VCONFKEY_MYFILE_EXTENSION_STATE +#define VCONFKEY_MYFILE_EXTENSION_STATE "db/private/org.tizen.myfile/extension_state" +#endif + +#ifndef VCONFKEY_MYFILE_RECENT_FILE +#define VCONFKEY_MYFILE_RECENT_FILE "db/private/org.tizen.myfile/recent_file" +#endif + + +#define MF_TIMER_INTERVAL_VIBRATION 0.5 +#define MF_VIBRATION_DEVICE 0 +#define MF_VIBRATION_DURATION 500 +#define DEF_BUF_LEN (512) + + +extern struct appdata *temp_data; +extern pthread_mutex_t pb_mutex; +extern pthread_mutex_t refresh_mutex; +struct navi_content_pop_s { + myfileNaviBar *pNavi; + struct appdata *ap; +}; + +/****************************** +** Prototype : __mf_util_is_mmc_supported +** Description : +** Input : int* supported +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_util_is_mmc_supported(int *supported) +{ + int data = -1; + int error_code = 0; + + if (supported == NULL) { + mf_debug("supported == NULL"); + return MYFILE_ERR_SRC_ARG_INVALID; + } + + *supported = 0; + + error_code = vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &data); + if (error_code) { + return MYFILE_ERR_GET_VCONF_FAIL; + } + + if (data != VCONFKEY_SYSMAN_MMC_MOUNTED) { + *supported = 0; + } else { + *supported = 1; + } + + return MYFILE_ERR_NONE; +} + +/****************************** +** Prototype : mf_util_is_mmc_on +** Description : +** Input : int *mmc_card +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +int mf_util_is_mmc_on(int *mmc_card) +{ + int error_code = 0; + + error_code = __mf_util_is_mmc_supported(mmc_card); + /* + if(mmc_card == TRUE){ + mf_debug("mmc is on phone\n"); + get_phone_status(&ret); + } */ + mf_debug("**************mmc_card is [%d]", *mmc_card); + return error_code; + +} + +#ifdef MYFILE_USB_OTG +static int __mf_util_is_otg_supported(int *supported) +{ + + if (supported == NULL) { + mf_debug("supported == NULL"); + return MYFILE_ERR_SRC_ARG_INVALID; + } + + *supported = 0; + + if(!ecore_file_exists(OTG_FOLDER) || ecore_file_dir_is_empty(OTG_FOLDER)) { + *supported = 0; + } else { + *supported = 1; + } + + return MYFILE_ERR_NONE; +} + +int mf_util_is_otg_on(int *otg) +{ + int error_code = 0; + + error_code = __mf_util_is_otg_supported(otg); + mf_debug("**************otg is [%d]", *otg); + return error_code; +} +#endif + +void mf_util_action_storage_insert(void *data, char *pItemLabel) +{ + + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + fsNodeInfo *pNode = NULL; + + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(STORAGE_PARENT); + pNode->name = g_strdup(MMC_NAME); + pNode->type = FILE_TYPE_DIR; + ap->mf_FileOperation.folder_list = eina_list_append(ap->mf_FileOperation.folder_list, pNode); + } + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(STORAGE_PARENT); + pNode->name = g_strdup(OTG_NAME); + pNode->type = FILE_TYPE_DIR; + ap->mf_FileOperation.folder_list = eina_list_append(ap->mf_FileOperation.folder_list, pNode); + } + + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + mf_widget_item_append(ap->mf_MainWindow.pNaviGenlist, pNode, ap); + } + + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + mf_widget_item_append(ap->mf_MainWindow.pNaviGenlist, pNode, ap); + } + } else { + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + mf_widget_item_append(ap->mf_MainWindow.pNaviGengrid, pNode, ap); + } + + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + mf_widget_item_append(ap->mf_MainWindow.pNaviGengrid, pNode, ap); + } + + } +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) + { + if (g_strcmp0(pItemLabel, GET_SYS_STR(MF_LABEL_MMC)) == 0) { + Elm_Object_Item *it = NULL; + it = mf_genlist_split_root_item_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist, MEMORY_FOLDER); + ap->mf_MainWindow.sSplitData.mmc_item = it; + } + + if (g_strcmp0(pItemLabel, GET_STR(MF_LABEL_OTG)) == 0) { + Elm_Object_Item *it = NULL; + it = mf_genlist_split_root_item_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist, OTG_FOLDER); + ap->mf_MainWindow.sSplitData.otg_item = it; + } + } +#endif +} + +/****************************** +** Prototype : mf_util_operation_alloc_failed +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_util_operation_alloc_failed(void *data) +{ + struct appdata *ap = (struct appdata *)data; + + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, GET_STR(MF_MSG_MEMORY_NOT_ENOUGH), + NULL, NULL, NULL, (Evas_Smart_Cb) elm_exit, NULL); +} +/**ecore_job handler related**/ +void mf_util_add_to_handler_list(void *data, Ecore_Job *handler, char *label) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + mf_retm_if(handler == NULL, "handler is NULL"); + mf_retm_if(label == NULL, "label is NULL"); + + myfileEcoreHandleNode *newNode = calloc(1, sizeof(myfileEcoreHandleNode)); + + if (newNode == NULL) { + mf_util_operation_alloc_failed(ap); + return; + } + + newNode->handler = handler; + newNode->navi_label = g_strdup(label); + + if (newNode->navi_label == NULL) { + SAFE_FREE_CHAR(newNode->navi_label); + SAFE_FREE_CHAR(newNode); + mf_util_operation_alloc_failed(ap); + return; + } + + ap->mf_FileOperation.job_pop_list = eina_list_append(ap->mf_FileOperation.job_pop_list, newNode); +} + +void mf_util_delete_from_handler_list(void *data, char *label, bool flag_del) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Eina_List *l; + void *node; + + EINA_LIST_FOREACH(ap->mf_FileOperation.job_pop_list, l, node) { + myfileEcoreHandleNode *pNode = (myfileEcoreHandleNode *)node; + if (pNode != NULL) { + if (g_strcmp0(pNode->navi_label, label) == 0) { + if (pNode->handler != NULL) { + if (flag_del == TRUE) + ecore_job_del(pNode->handler); + pNode->handler = NULL; + } + ap->mf_FileOperation.job_pop_list = eina_list_remove(ap->mf_FileOperation.job_pop_list, pNode); + SAFE_FREE_CHAR(pNode->navi_label); + SAFE_FREE_CHAR(pNode); + break; + } + } + } +} + +void mf_util_clear_handler_list(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Eina_List *l; + void *node; + + EINA_LIST_FOREACH(ap->mf_FileOperation.job_pop_list, l, node) { + myfileEcoreHandleNode *pNode = (myfileEcoreHandleNode *)node; + if(pNode != NULL) { + if (pNode->handler != NULL) { + ecore_job_del(pNode->handler); + pNode->handler = NULL; + } + SAFE_FREE_CHAR(pNode->navi_label); + SAFE_FREE_CHAR(pNode); + } + } +} +/**end of ecore_job handler related**/ + + +/****************************** +** Prototype : mf_util_refresh_screen +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +int mf_util_refresh_screen(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Eina_List *l = NULL; + void *item = NULL; + myfileNaviBar *pNavi_s = NULL; + myfileNaviBar *pNavi_toshow = NULL; + + if (ap->mf_Status.more == MORE_IDLE_DELETE) { + if (ap->mf_Status.preMore == MORE_DEFAULT) { + ap->mf_Status.more = MORE_DEFAULT; + mf_widget_refresh_view(ap); + if (ap->mf_FileOperation.iOperationSuccessFlag) { + mf_popup_indicator_popup(ap, GET_SYS_STR(MF_MSG_DELETE_SUCCESS)); + } else { + mf_popup_indicator_popup(ap, ap->mf_FileOperation.pOperationMsg); + } + + } else { + ap->mf_Status.more = ap->mf_Status.preMore; + if (ap->mf_FileOperation.idle_delete_item) { + mfItemData_s *params = elm_object_item_data_get(ap->mf_FileOperation.idle_delete_item); + if (params && params->m_ItemName) { + char *path = params->m_ItemName->str; + if (path && !ecore_file_exists(path)) { + elm_object_item_del(ap->mf_FileOperation.idle_delete_item); + } + } + } + ap->mf_FileOperation.idle_delete_item = NULL; + if (ap->mf_FileOperation.iOperationSuccessFlag) { + mf_popup_indicator_popup(ap, GET_SYS_STR(MF_MSG_DELETE_SUCCESS)); + } else { + mf_popup_indicator_popup(ap, ap->mf_FileOperation.pOperationMsg); + } + return MYFILE_ERR_NONE; + } + } else { + /*0 set state to be Default */ + int current_more = ap->mf_Status.more; + ap->mf_Status.more = MORE_DEFAULT; + /*1 recover all the navigation bar */ + EINA_LIST_FOREACH(ap->mf_MainWindow.plistNaviBar, l, item) { + pNavi_s = (myfileNaviBar *) item; + if (pNavi_s == NULL) { + continue; + } + /*1.2 reset current path for each navigation bar*/ + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + if (pNavi_s->pre_operation.path && pNavi_s->pre_operation.path->str) { + pNavi_s->pCurrentPath = g_strdup(pNavi_s->pre_operation.path->str); + g_string_free(pNavi_s->pre_operation.path, TRUE); + } else { + pNavi_s->pCurrentPath = g_strdup(PHONE_FOLDER); + } + pNavi_s->pre_operation.path = NULL; + memset(&(pNavi_s->pre_operation), 0, sizeof(oper_record)); + + if (pNavi_s->naviFlagInUse == TRUE) { + /*2.2 set pNavi_toshow for refreshing */ + pNavi_toshow = pNavi_s; + } + } + if (pNavi_toshow == NULL) { + mf_debug("pNavi_toshow is NULL"); + return MYFILE_ERR_GET_NAVI_FAILED; + } else { + /*3. refresh the content of the view */ + if (pNavi_toshow->pCurrentPath != NULL) { + free(pNavi_toshow->pCurrentPath); + pNavi_toshow->pCurrentPath = NULL; + } + pNavi_toshow->pCurrentPath = g_strdup(ap->mf_Status.path->str); + mf_widget_refresh_view(ap); + } + char *label = NULL; + if (ap->mf_FileOperation.iOperationSuccessFlag) { + switch(current_more) { + case MORE_DATA_COPYING: + label = GET_SYS_STR(MF_MSG_COPY_SCCESS); + break; + case MORE_DATA_MOVING: + label = GET_SYS_STR(MF_MSG_MOVE_SUCCESS); + break; + case MORE_IDLE_DELETE: + case MORE_DELETE: + label = GET_SYS_STR(MF_MSG_DELETE_SUCCESS); + break; + default: + break; + } + } else { + label = ap->mf_FileOperation.pOperationMsg; + } + + mf_popup_indicator_popup(ap, label); + SAFE_FREE_CHAR(ap->mf_FileOperation.pOperationMsg); + } + if (ap->mf_Status.flagNoContent == 1) { + if (ap->mf_MainWindow.pNaviCtrlBar) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, TRUE); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_NOCONTENT_VIEW, true); + } + } + if (ap->mf_MainWindow.pFinishPopup) { + evas_object_del(ap->mf_MainWindow.pFinishPopup); + ap->mf_MainWindow.pFinishPopup = NULL; + } + if (ap->mf_MainWindow.pMmcRemovedPopup) { + evas_object_del(ap->mf_MainWindow.pMmcRemovedPopup); + ap->mf_MainWindow.pMmcRemovedPopup = NULL; + } + MF_TRACE_END; + return MYFILE_ERR_NONE; +} + + + +/****************************** +** Prototype : mf_util_check_forbidden_operation +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +bool mf_util_check_forbidden_operation(void *data) +{ + /* + ** forbidden operations includes: + ** 1. Recursion move/copy + ** 2. move with same file in the same folder + */ + + struct appdata *ap = (struct appdata *)data; + assert(ap); + + Eina_List *l = NULL; + GString *pNode = NULL; + GString *from = NULL; + GString *to = ap->mf_FileOperation.destination; + Eina_List *pSourceList = ap->mf_FileRecordList.value_saver; + const char *message = NULL; + + EINA_LIST_FOREACH(pSourceList, l, pNode) { + if (pNode) { + from = pNode; + if (mf_fm_svc_wrapper_detect_recursion(from, to) == MYFILE_REPORT_RECURSION_DETECT) { + if (ap->mf_Status.more == MORE_DATA_MOVING) { + message = GET_STR(MF_MSG_MOVE_FAILED1); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, + NULL, NULL, NULL, NULL, NULL); + + ap->mf_Status.more = MORE_INTERNAL_MOVE; + } else if (ap->mf_Status.more == MORE_DATA_COPYING) { + message = GET_STR(MF_MSG_COPY_FAILED1); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, + NULL, NULL, NULL, NULL, NULL); + + ap->mf_Status.more = MORE_INTERNAL_COPY; + } + ap->mf_Status.more = MORE_INTERNAL_COPY_MOVE; + return false; + } + } + } + + from = ap->mf_FileOperation.source; + if (ap->mf_Status.more == MORE_DATA_MOVING) { + if (!strcmp(from->str, to->str)) { + message = GET_STR(MF_MSG_MOVE_FAILED2); + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, message, NULL, NULL, NULL, NULL, NULL); + ap->mf_Status.more = MORE_INTERNAL_MOVE; + return false; + } + } + return true; +} + +/****************************** +** Prototype : mf_util_check_disk_space +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +int mf_util_check_disk_space(void *data) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + MF_STORAGE state = MYFILE_NONE; + unsigned long free_space = 0; + + if (ap->mf_Status.more == MORE_CREATE_FOLDER) { + state = mf_fm_svc_wrapper_get_location(ap->mf_Status.path->str); + free_space = mf_fm_svc_wrapper_get_free_space(state); + mf_debug("free size is %lu\n", free_space); + /* + ** in vfat fs type, sector size is 16K. + ** it is to say that the limited size of the free space should be 16K + ** or it will report space used up. + ** check free_space == 0 can make sure at least 16K is free on the disk + ** while every dir takes 4K + */ + if (free_space == 0) { + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT_BTN, NULL, + GET_STR(MF_MSG_NOT_ENOUGH_SPACE), GET_SYS_STR(MF_BUTTON_LABEL_OK), + NULL, NULL, mf_callback_warning_popup_cb, ap); + mf_debug("Not Enough free size\n"); + return MYFILE_ERR_NO_FREE_SPACE; + } + } + + return MYFILE_ERR_NONE; +} + + +/****************************** +** Prototype : mf_util_get_eina_list_len +** Description : +** Input : const Eina_List* list +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +int mf_util_get_eina_list_len(const Eina_List *list) +{ + return eina_list_count(list); +} + + +void mf_util_free_eina_list_with_data(Eina_List **list, MYFILE_CONTENT_TYPE type) +{ + MF_TRACE_BEGIN; + if (list == NULL || *list == NULL) { + return; + } + + void *pNode = NULL; + Eina_List *l = NULL; + + switch (type) { + case MYFILE_TYPE_GSTRING: + EINA_LIST_FOREACH(*list, l, pNode) { + if (pNode != NULL) { + g_string_free(pNode, TRUE); + pNode = NULL; + } + } + break; + case MYFILE_TYPE_CHAR: + EINA_LIST_FOREACH(*list, l, pNode) { + if (pNode != NULL) { + free(pNode); + pNode = NULL; + } + } + break; + case MYFILE_TYPE_FSNODE: + EINA_LIST_FOREACH(*list, l, pNode) { + fsNodeInfo *Node = (fsNodeInfo *)pNode; + if (Node != NULL) { + SAFE_FREE_CHAR(Node->path); + SAFE_FREE_CHAR(Node->name); + SAFE_FREE_CHAR(Node->ext); + + free(Node); + Node = NULL; + } + } + break; + default: + break; + } + + eina_list_free(*list); + *list = NULL; + MF_TRACE_END; + return; +} + +int mf_util_icu_init(void *data) +{ + MF_TRACE_BEGIN; + assert(data); + struct appdata *ap = (struct appdata *)data; + char *skeleton; + UChar customSkeleton[MYFILE_ICU_ARR_LENGTH] = { '\0' }; + int skeletonLength = 0; + char *timezone_id = NULL; + UChar utimezone_id[BUFF_SIZE] = {0,}; + + UErrorCode status = U_ZERO_ERROR; + UDateTimePatternGenerator *generator; + UDateFormat *formatter; + UChar bestPattern[MYFILE_ICU_ARR_LENGTH] = { 0, }; + int32_t bestPatternLength; + bool timeformat = false; + + timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); + + if (timezone_id == NULL) { + return MYFILE_ERR_INVALID_ARG; + } + + u_uastrcpy(utimezone_id, timezone_id); + + ucal_setDefaultTimeZone(utimezone_id , &status); + + int ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_24HOUR_CLOCK_FORMAT_ENABLED, &timeformat); + + if (ret != 0) { + mf_debug(); + return MYFILE_ERR_SETTING_RESET_FAIL; + } + + if (!timeformat) { + skeleton = g_strdup(MYFILE_DATEFORMAT_12); + } else { + skeleton = g_strdup(MYFILE_DATEFORMAT_24); + } + + skeletonLength = strlen(skeleton); + if (u_uastrncpy(customSkeleton, skeleton, skeletonLength) == NULL) { + return MYFILE_ERR_INVALID_ARG; + } + + char *region = vconf_get_str(VCONFKEY_REGIONFORMAT); + if (region == NULL) { + return MYFILE_ERR_INVALID_ARG; + } + + uloc_setDefault(getenv("LC_TIME"), &status); + + generator = udatpg_open(region, &status); + if (generator == NULL) { + return MYFILE_ERR_INVALID_ARG; + } + ap->mf_Status.generator = generator; + + bestPatternLength = udatpg_getBestPattern(generator, customSkeleton, u_strlen(customSkeleton), bestPattern, MYFILE_ICU_ARR_LENGTH, &status); + if (bestPatternLength <= 0) { + return MYFILE_ERR_INVALID_ARG; + } + + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, region, NULL, -1, bestPattern, -1, &status); + if (formatter == 0) { + return MYFILE_ERR_INVALID_ARG; + } + ap->mf_Status.formatter = formatter; + ap->mf_Status.flagIcuInit = TRUE; + + MF_TRACE_END; + return MYFILE_ERR_NONE; + } + +void mf_util_icu_finalize(void *data) +{ + MF_TRACE_BEGIN; + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.generator != NULL) { + udatpg_close(ap->mf_Status.generator); + ap->mf_Status.generator = NULL; + } + + if (ap->mf_Status.formatter) { + udat_close(ap->mf_Status.formatter); + ap->mf_Status.formatter = NULL; + } + + ap->mf_Status.flagIcuInit = FALSE; + MF_TRACE_END; +} + +char *mf_util_icu_translate(void *data, UDate date) +{ + MF_TRACE_BEGIN; + assert(data); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.flagIcuInit == FALSE) + { + if(MYFILE_ERR_NONE !=mf_util_icu_init(ap)) + { + mf_debug("invalid icu init check int"); + return NULL; + } + } + + UErrorCode status = U_ZERO_ERROR; + UChar formatted[MYFILE_ICU_ARR_LENGTH] = { 0, }; + char formattedString[MYFILE_ICU_ARR_LENGTH] = { 0, }; + int32_t formattedLength; + + formattedLength = udat_format(ap->mf_Status.formatter, date, formatted, MYFILE_ICU_ARR_LENGTH, NULL, &status); + if (formattedLength <= 0) { + return NULL; + } + + u_austrcpy(formattedString, formatted); + if (strlen(formattedString) == 0) { + return NULL; + } + + MF_TRACE_END; + return g_strdup(formattedString); +} + +int mf_util_get_vconf_value(MYFILE_VCONF_TYPE type, int *value) +{ + int ret = MYFILE_ERR_NONE; + switch (type) { + case VCONF_TYPE_SORT_TYPE: + { + ret = vconf_get_int(VCONFKEY_MYFILE_LIST_BY, value); + if (ret < 0) { + mf_warnig("fail to get list_by value, set it default"); + vconf_set_int(VCONFKEY_MYFILE_LIST_BY, MYFILE_SORT_BY_DATE_R2O); + *value = MYFILE_SORT_BY_DATE_R2O; + } else { + if (*value <= MYFILE_SORT_BY_NONE || *value >= MYFILE_SORT_BY_MAX) { + mf_warnig("invaild list by type[%d], set it default", *value); + vconf_set_int(VCONFKEY_MYFILE_LIST_BY, MYFILE_SORT_BY_DATE_R2O); + *value = MYFILE_SORT_BY_DATE_R2O; + } + } + return MYFILE_ERR_NONE; + } + break; + case VCONF_TYPE_VIEW_STYLE: + ret = vconf_get_int(VCONFKEY_MYFILE_VIEW_STYLE, value); + if (ret < 0) { + mf_warnig("fail to get list_by value, set it default"); + vconf_set_int(VCONFKEY_MYFILE_VIEW_STYLE, MF_VIEW_STYLE_LIST); + *value = MF_VIEW_STYLE_LIST; + } else { + if (*value < MF_VIEW_STYLE_LIST || *value > MF_VIEW_STYLE_THUMBNAIL) { + mf_warnig("invaild list by type[%d], set it default", *value); + vconf_set_int(VCONFKEY_MYFILE_VIEW_STYLE, MF_VIEW_STYLE_LIST); + *value = MF_VIEW_STYLE_LIST; + } + } + break; + case VCONF_TYPE_DATE_FORMAT: + ret = vconf_get_int(VCONFKEY_SETAPPL_DATE_FORMAT_INT, value); + break; + case VCONF_TYPE_NFC_ENABLE: + ret = vconf_get_int(VCONFKEY_NFC_FEATURE, value); + break; + case VCONF_TYPE_EXTENSION_STATE: + ret = vconf_get_int(VCONFKEY_MYFILE_EXTENSION_STATE, value); + if (ret < 0) { + mf_warnig("fail to get list_by value, set it default"); + vconf_set_int(VCONFKEY_MYFILE_EXTENSION_STATE, MF_EXTENSION_SHOW); + *value = MF_EXTENSION_SHOW; + } else { + if (*value < MF_VIEW_STYLE_LIST || *value > MF_VIEW_STYLE_THUMBNAIL) { + mf_warnig("invaild list by type[%d], set it default", *value); + vconf_set_int(VCONFKEY_MYFILE_EXTENSION_STATE, MF_EXTENSION_SHOW); + *value = MF_EXTENSION_SHOW; + } + } + break; + default: + break; + } + if (ret != MYFILE_ERR_NONE) { + ret = MYFILE_ERR_VCONF_GET_FAILED; + } + return ret; +} + +void mf_util_set_sort_type(int value) +{ + if (value <= MYFILE_SORT_BY_NONE || value >= MYFILE_SORT_BY_MAX) { + mf_warnig("invaild list by type[%d], set it default", value); + vconf_set_int(VCONFKEY_MYFILE_LIST_BY, MYFILE_SORT_BY_DATE_R2O); + } else { + mf_debug("value is [%d]", value); + vconf_set_int(VCONFKEY_MYFILE_LIST_BY, value); + } + return; +} + +void mf_util_set_extension_state(int value) +{ + if (value <= MF_EXTENSION_NONE || value >= MF_EXTENSION_MAX) { + mf_warnig("invaild list by type[%d], set it default", value); + vconf_set_int(VCONFKEY_MYFILE_EXTENSION_STATE, MF_EXTENSION_SHOW); + } else { + mf_debug("value is [%d]", value); + vconf_set_int(VCONFKEY_MYFILE_EXTENSION_STATE, value); + } + return; +} + +void mf_util_set_view_style(int value) +{ + if (value < MF_VIEW_STYLE_LIST || value > MF_VIEW_STYLE_THUMBNAIL) { + mf_warnig("invaild list by type[%d], set it default", value); + vconf_set_int(VCONFKEY_MYFILE_VIEW_STYLE, MF_VIEW_STYLE_LIST); + } else { + mf_debug("value is [%d]", value); + vconf_set_int(VCONFKEY_MYFILE_VIEW_STYLE, value); + } + return; +} + +void mf_util_set_recent_file(char *path) +{ + if (path) { + mf_debug("path is [%s]", path); + int ret = vconf_set_str(VCONFKEY_MYFILE_RECENT_FILE, path); + mf_debug("ret is [%d]", ret); + + } + return; +} + +void mf_util_merge_eina_list_to_glist(const Eina_List *eSource, GList **gSource) +{ + mf_retm_if(eSource == NULL, "eSource is NULL"); + mf_retm_if(gSource == NULL, "gSource is NULL"); + + + const Eina_List *l = NULL; + GString *pNode = NULL; + + EINA_LIST_FOREACH(eSource, l, pNode) { + if (pNode) { + *gSource = g_list_append(*gSource, pNode->str); + } + } + +} + +void mf_util_exception_func(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + switch (ap->mf_Status.more) { + case MORE_DATA_COPYING: + ap->mf_Status.more = MORE_INTERNAL_COPY; + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, + GET_STR(MF_MSG_COPY_FAILED2), NULL, NULL, NULL, (Evas_Smart_Cb)mf_callback_exception_popup_cb, ap); + break; + case MORE_DATA_MOVING: + ap->mf_Status.more = MORE_INTERNAL_MOVE; + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, + GET_STR(MF_MSG_MOVE_FAILED3), NULL, NULL, NULL, (Evas_Smart_Cb)mf_callback_exception_popup_cb, ap); + break; + case MORE_DELETE: + ap->mf_Status.more = ap->mf_Status.preMore; + ap->mf_MainWindow.pNormalPopup = mf_popup_create_popup(ap, POPMODE_TEXT, NULL, GET_STR(MF_MSG_DEL_FAILED1), NULL, NULL, NULL, NULL, NULL); + break; + default: + break; + } + MF_TRACE_END; +} + +int mf_util_is_valid_name_check(const char *name) +{ + MF_TRACE_BEGIN; + mf_retvm_if(name == NULL, MF_INTERNAL_FILE_NAME_NULL, "name is NULL"); + gchar *temp_name = NULL; + int ret = MYFILE_ERR_NONE; + + int length = strlen(name); + if (length) { + if (strncmp(name, ".", length) == 0 || strncmp(name, "..", length) == 0) { + ret = MF_INTERNAL_FILE_NAME_IGNORE; + goto EXIT; + } + + temp_name = g_strconcat(name, NULL); + if (strlen(g_strstrip(temp_name)) == 0) { + ret = MF_INTERNAL_FILE_NAME_CHUG; + goto EXIT; + } + + if (mf_util_character_count_get(name) > MYFILE_FILE_NAME_LEN_MAX) { + ret = MF_INTERNAL_FILE_NAME_MAX_LENGTH; + goto EXIT; + } + + if (mf_file_attr_is_valid_name(name) != MYFILE_ERR_NONE) { + ret = MF_INTERNAL_FILE_NAME_INVALID_CHAR; + } + } else { + ret = MF_INTERNAL_FILE_NAME_EMPTY; + } + +EXIT: + if (temp_name) { + g_free(temp_name); + temp_name = NULL; + } + MF_TRACE_END; + return ret; +} + +#ifdef MYFILE_USB_OTG +void mf_util_ex_disk_list_update(void *data) +{ + assert(data); + struct appdata *ap = (struct appdata *)data; + mf_debug(); + int iIsNoContent = 0; + Evas_Object *newContent = NULL; + + iIsNoContent = ap->mf_Status.flagNoContent; + newContent = mf_navi_bar_content_create(ap); + Evas_Object *pConformant = mfNaviBarConformGet(ap); + mfNaviBarSetContent(ap, pConformant, newContent); + mf_debug(); +} +#endif + + +char *mf_util_upper_folder_name_get(void *data, GString *fullpath) +{ + mf_retvm_if(data == NULL, NULL, "data is NULL"); + mf_retvm_if(fullpath == NULL, NULL, "fullpath is NULL"); + mf_retvm_if(fullpath->str == NULL, NULL, "fullpath is NULL"); + struct appdata *ap = (struct appdata *)data; + + GString *parent_path = NULL; + GString *gName = NULL; + char *upper_name = NULL; + + parent_path = mf_fm_svc_wrapper_get_file_parent_path(fullpath); + + mf_retvm_if(parent_path == NULL, NULL, "fullpath is NULL"); + mf_retvm_if(parent_path->str == NULL, NULL, "fullpath is NULL"); + + + if (!g_strcmp0(parent_path->str, PHONE_FOLDER)) { + upper_name = g_strdup(GET_SYS_STR(MF_LABEL_PHONE)); + } else if (!g_strcmp0(parent_path->str, MEMORY_FOLDER)) { + upper_name = g_strdup(GET_SYS_STR(MF_LABEL_MMC)); +#ifdef MYFILE_USB_OTG + } else if (!g_strcmp0(parent_path->str, OTG_FOLDER)){ + upper_name = g_strdup(GET_STR(MF_LABEL_OTG)); +#endif + } else { + gName = mf_fm_svc_wrapper_get_file_name(parent_path); + GSTRING_CHECK_NULL_GOTO(gName, FAILED_EXIT); + upper_name = g_strdup(gName->str); + } + + CHAR_CHECK_NULL_GOTO(upper_name, FAILED_EXIT); + SAFE_FREE_GSTRING(parent_path); + SAFE_FREE_GSTRING(gName); + return upper_name; + +FAILED_EXIT: + SAFE_FREE_GSTRING(parent_path); + SAFE_FREE_GSTRING(gName); + mf_util_operation_alloc_failed(ap); + return NULL; + +} + +void mf_util_set_pm_lock(void *data, Eina_Bool isLock) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + int ret = 0; + if (ap->mf_Status.flagLCDLock != isLock) { + if (ap->mf_Status.flagLCDLock == EINA_TRUE) { + ap->mf_Status.flagLCDLock = EINA_FALSE; + } else { + ap->mf_Status.flagLCDLock = EINA_TRUE; + } + + if (ap->mf_Status.flagLCDLock) { + mf_debug("lock the LCD_OFF"); + ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0); + } else { + mf_debug("unlock the LCD_OFF"); + ret = power_unlock_state(POWER_STATE_SCREEN_OFF); + } + if (ret != 0) + mf_debug("fail to lock(unlock)"); + + } + MF_TRACE_END; +} + +long mf_util_character_count_get(const char *original) +{ + mf_retvm_if(original == NULL, 0, "input string is NULL"); + long count = 0; + char *utf8_form = g_locale_to_utf8(original, -1, NULL, NULL, NULL); + if (utf8_form == NULL) + return count; + else { + count = g_utf8_strlen(utf8_form, -1); + free(utf8_form); + mf_debug("utf8 count is %ld", count); + return count; + } +} + +MF_THEME_TYPE mf_util_get_theme(void) +{ + MF_THEME_TYPE theme = THEME_INVALID; + char *name; + + char *theme_name = vconf_get_str(VCONFKEY_SETAPPL_WIDGET_THEME_STR); + mf_debug("theme is [%s]", theme_name); + mf_retvm_if(theme_name == NULL, THEME_ERROR, "Failed to get vconf value"); /* file system exceptional handle */ + + name = strrchr(theme_name, '/'); + + if (!name) + name = theme_name; + else + ++name; + + mf_debug("name is [%s]", name); + //SETTING_TRACE("name:%s", name); + /* special theme process.. */ + if (0 == g_strcmp0("tizen-black.edj", name) || 0 == g_strcmp0("tizen-black-hd.edj", name)) { + theme = THEME_NBEAT_BLACK; + } else if (0 == g_strcmp0("tizen.edj", name) || 0 == g_strcmp0("tizen-hd.edj", name)) { + theme = THEME_NBEAT; + } else { + theme = THEME_ERROR; + } + free(theme_name); + theme_name = NULL; + mf_debug("theme is [%d]", theme); + return theme; +} + +Eina_List *mf_util_get_all_selected(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Eina_List *select_list = NULL; + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + mf_genlist_get_list_selected_files(ap->mf_MainWindow.pEditView.pGenlist, &select_list); + } else { + mf_gengrid_get_grid_selected_files(ap->mf_MainWindow.pEditView.pGengrid, &select_list); + } + MF_TRACE_END; + return select_list; + +} + +Eina_List *mf_util_get_all_selected_items(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Eina_List *select_list = NULL; + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + mf_genlist_get_list_selected_items(ap->mf_MainWindow.pEditView.pGenlist, &select_list); + } else { + mf_gengrid_get_grid_selected_items(ap->mf_MainWindow.pEditView.pGengrid, &select_list); + } + MF_TRACE_END; + return select_list; + +} + + +gboolean mf_util_is_file_selected(Eina_List **source, GString *path) +{ + MF_TRACE_BEGIN; + mf_retvm_if(*source == NULL, FALSE, "source is NULL"); + mf_retvm_if(path == NULL, FALSE, "path is NULL"); + + bool flag = FALSE; + Eina_List *l = NULL; + void *data = NULL; + + EINA_LIST_FOREACH(*source, l, data) { + GString *source_path = (GString *)data; + if (source_path && source_path->str) { + mf_debug("source_path is [%s] path is [%s]", source_path->str, path->str); + if (g_strcmp0(source_path->str, path->str) == 0) { + flag = TRUE; + mf_debug("flag is [%d]source_path is [%s] path is [%s]",flag, source_path->str, path->str); + *source = eina_list_remove(*source, source_path); + g_string_free(source_path, TRUE); + source_path = NULL; + int ret = eina_list_count(*source); + if (ret == 0) { + *source = NULL; + } + break; + } else { + continue; + } + } + } + MF_TRACE_END; + return flag; +} + +int mf_util_generate_list_data(const char *path, Eina_List ** default_dir_list, Eina_List ** user_dir_list, Eina_List ** file_list) +{ + MF_TRACE_BEGIN; + assert(path); + assert(default_dir_list); + assert(user_dir_list); + assert(file_list); + int error_code = 0; + Eina_List *dir_list = NULL; + error_code = mf_fm_svc_wrapper_get_file_list(path, &dir_list, file_list); + + if (error_code != MYFILE_ERR_NONE) { + return error_code; + } + + /* classify the dir list to default and user defined */ + error_code = mf_fm_svc_wrapper_classify_dir_list(dir_list, default_dir_list, user_dir_list); + if (error_code != MYFILE_ERR_NONE) { + return error_code; + } + eina_list_free(dir_list); + MF_TRACE_END; + return error_code; +} + + +int mf_util_generate_file_list(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, MYFILE_ERR_INVALID_ARG, "data is null"); + struct appdata *ap = (struct appdata *)data; + + Eina_List *file_list = NULL; + Eina_List *default_dir_list = NULL; + Eina_List *user_dir_list = NULL; + int error_code = 0; + + mf_retvm_if(ap->mf_Status.path == NULL, MYFILE_ERR_INVALID_ARG, "ap->mf_Status.path is NULL"); + mf_retvm_if(ap->mf_Status.path->str == NULL, MYFILE_ERR_INVALID_ARG, "ap->mf_Status.path->str is NULL"); + + error_code = mf_util_generate_list_data(ap->mf_Status.path->str, &default_dir_list, &user_dir_list, &file_list); + if (error_code != MYFILE_ERR_NONE) { + /*Todo: we need to free all the Eina_List*/ + return error_code; + } + + + if (ap->mf_FileOperation.folder_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.folder_list), MYFILE_TYPE_FSNODE); + } + if (ap->mf_FileOperation.file_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.file_list), MYFILE_TYPE_FSNODE); + } + + ap->mf_FileOperation.file_list = file_list; + ap->mf_FileOperation.default_dir_list = default_dir_list; + ap->mf_FileOperation.user_dir_list = user_dir_list; + + return error_code; +} + +int mf_util_generate_root_view_file_list(void *data, Eina_List **list, int storage_state) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, 0, "data is null"); + struct appdata *ap = (struct appdata *)data; + + fsNodeInfo *pNode = NULL; + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(PHONE_PARENT); + pNode->name = g_strdup(PHONE_NAME); + mf_file_attr_get_file_stat(PHONE_FOLDER, &pNode); + pNode->type = FILE_TYPE_DIR; + *list = eina_list_append(*list, pNode); + + if (storage_state & MYFILE_MMC) { + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(STORAGE_PARENT); + pNode->name = g_strdup(MMC_NAME); + mf_file_attr_get_file_stat(MEMORY_FOLDER, &pNode); + pNode->type = FILE_TYPE_DIR; + *list = eina_list_append(*list, pNode); + } + + if (storage_state & MYFILE_OTG) { + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + memset(pNode, 0, sizeof(fsNodeInfo)); + /*set path */ + pNode->path = g_strdup(STORAGE_PARENT); + pNode->name = g_strdup(OTG_NAME); + mf_file_attr_get_file_stat(OTG_FOLDER, &pNode); + pNode->type = FILE_TYPE_DIR; + *list = eina_list_append(*list, pNode); + } + + return 0; +} + + +void mf_util_sort_the_file_list(void *data) +{ + + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is null"); + struct appdata *ap = (struct appdata *)data; + + int iSortTypeValue = 0; + + mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + + if (ap->mf_Status.view_type == mf_view_root_category) { + mf_fs_oper_sort_list(&ap->mf_FileOperation.category_list, iSortTypeValue); + } + mf_fs_oper_sort_list(&ap->mf_FileOperation.file_list, iSortTypeValue); + + ap->mf_FileOperation.folder_list = eina_list_merge(ap->mf_FileOperation.user_dir_list, ap->mf_FileOperation.default_dir_list); + ap->mf_FileOperation.user_dir_list = NULL; + ap->mf_FileOperation.default_dir_list = NULL; + /*need to sort folder items only By Name and Date*/ + if (iSortTypeValue == MYFILE_SORT_BY_NAME_A2Z || iSortTypeValue == MYFILE_SORT_BY_NAME_Z2A || iSortTypeValue == MYFILE_SORT_BY_DATE_R2O + || iSortTypeValue == MYFILE_SORT_BY_DATE_O2R) { + ap->mf_Status.iFolderSortType = iSortTypeValue; + mf_fs_oper_sort_list(&ap->mf_FileOperation.folder_list, iSortTypeValue); + } else { + mf_fs_oper_sort_list(&ap->mf_FileOperation.folder_list, ap->mf_Status.iFolderSortType); + } + MF_TRACE_END; +} + + +void mf_util_rotate_state_set(void *data, app_device_orientation_e rotate_mode) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is null"); + struct appdata *ap = (struct appdata *)data; +#ifdef MYFILE_SPLIT_VIEW + + switch (rotate_mode) { + case APP_DEVICE_ORIENTATION_270: + ap->mf_Status.rotation_angle = -90; + ap->mf_Status.view_mode_end = FALSE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_270; + break; + + case APP_DEVICE_ORIENTATION_90: + ap->mf_Status.rotation_angle = 90; + ap->mf_Status.view_mode_end = FALSE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_90; + break; + + case APP_DEVICE_ORIENTATION_180: + ap->mf_Status.rotation_angle = 0; //180; + ap->mf_Status.view_mode_end = TRUE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_180; + break; + + case APP_DEVICE_ORIENTATION_0 : + default: + ap->mf_Status.rotation_angle = 0; + ap->mf_Status.view_mode_end = TRUE; + ap->mf_Status.pre_rotate_type = APP_DEVICE_ORIENTATION_0; + break; + } + if (rotate_mode == APP_DEVICE_ORIENTATION_270 || rotate_mode == APP_DEVICE_ORIENTATION_90) { + ap->mf_Status.rotation_type = MF_ROTATE_LANDSCAPE; + } else { + ap->mf_Status.rotation_type = MF_ROTATE_PORTRAIT; + } + mf_debug("rotate_mode is [%d] rotation_type is [%d]", rotate_mode, ap->mf_Status.rotation_type); + + elm_win_rotation_with_resize_set(ap->mf_MainWindow.pWindow, ap->mf_Status.rotation_angle); + +#endif + MF_TRACE_END; +} + +const char *mf_util_search_markup_keyword(const char *string, char *searchword, bool *result) +{ + //SEARCH_FUNC_START; + MF_TRACE_BEGIN; + char pstr[DEF_BUF_LEN + 1] = {0,}; + static char return_string[DEF_BUF_LEN + 1] = { 0, }; + int word_len = 0; + int search_len = 0; + int i = 0; + bool found = false; + gchar* markup_text_start = NULL; + gchar* markup_text_end= NULL; + gchar* markup_text= NULL; + + mf_retvm_if(string == NULL, NULL, "string is NULL"); + mf_retvm_if(searchword == NULL, NULL, "searchword is NULL"); + mf_retvm_if(result == NULL, NULL, "result is NULL"); + + if(g_utf8_validate(string,-1,NULL)) { + + strncpy(pstr, string, DEF_BUF_LEN); + + word_len = strlen(pstr); + search_len = strlen(searchword); + + for (i = 0; i < word_len; i++) { + if (!strncasecmp(searchword, &pstr[i], search_len)) { + found = true; + break; + } + } + + *result = found; + memset(return_string, 0x00, DEF_BUF_LEN+1); + + if (found) { + if (i == 0) { + markup_text = g_markup_escape_text(&pstr[0], search_len); + markup_text_end = g_markup_escape_text(&pstr[search_len], word_len-search_len); + mf_retvm_if(markup_text == NULL, NULL, "markup_text is NULL"); + mf_retvm_if(markup_text_end == NULL, NULL, "markup_text_end is NULL"); + + snprintf(return_string, + DEF_BUF_LEN, + "%s%s", + markup_text, + (char*)markup_text_end); + SAFE_FREE_CHAR(markup_text); + SAFE_FREE_CHAR(markup_text_end); + } else { + markup_text_start = g_markup_escape_text(&pstr[0], i); + markup_text = g_markup_escape_text(&pstr[i], search_len); + + markup_text_end = g_markup_escape_text(&pstr[i+search_len], word_len-(i+search_len)); + mf_retvm_if(markup_text_start == NULL, NULL, "markup_text_start is NULL"); + mf_retvm_if(markup_text == NULL, NULL, "markup_text is NULL"); + mf_retvm_if(markup_text_end == NULL, NULL, "markup_text_end is NULL"); + snprintf(return_string, + DEF_BUF_LEN, + "%s%s%s", + (char*)markup_text_start, + markup_text, + (char*)markup_text_end); + SAFE_FREE_CHAR(markup_text); + SAFE_FREE_CHAR(markup_text_start); + SAFE_FREE_CHAR(markup_text_end); + } + } else { + snprintf(return_string, DEF_BUF_LEN, "%s", pstr); + } + } + MF_TRACE_END; + + return return_string; + +} + +char *mf_util_get_text(const char *ID) +{ + MF_CHECK_NULL(ID); + char *str; + + if(strstr(ID, "IDS_COM")) + str = dgettext("sys_string", ID); + else + str = gettext(ID); + + return str; +} + +fsNodeInfo *mf_util_generate_pnode(const char *path, int file_type) +{ + mf_retvm_if(path == NULL, NULL, "path is NULL"); + fsNodeInfo *pNode = NULL; + int error = MYFILE_ERR_NONE; + + pNode = (fsNodeInfo *) malloc(sizeof(fsNodeInfo)); + if (pNode == NULL) { + return NULL; + } + memset(pNode, 0, sizeof(fsNodeInfo)); + char *parent = NULL; + error = mf_file_attr_get_parent_path(path, &parent); + if (error == MYFILE_ERR_NONE) { + pNode->path = parent; + pNode->name = g_strdup(ecore_file_file_get(path)); + mf_file_attr_get_file_stat(path, &pNode); + if (file_type == FILE_TYPE_DIR) { + pNode->type = file_type; + } else { + mf_file_attr_get_file_category(path, &(pNode->type)); + } + } else { + SAFE_FREE_CHAR(pNode); + } + return pNode; +} +void mf_util_generate_list(Eina_List **list, const char *path, int file_type) +{ + mf_retm_if(list == NULL, "list is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + + fsNodeInfo *pNode = mf_util_generate_pnode(path, file_type); + + if (pNode) + *list = eina_list_append(*list, pNode); +} + + +void mf_util_remove_item_from_list_by_location(Eina_List **list, int location) +{ + mf_retm_if(list == NULL, "list is NULL"); + + Eina_List *l = NULL; + fsNodeInfo *node = NULL; + + EINA_LIST_FOREACH(*list, l, node) { + if ((fsNodeInfo *)node != NULL && ((fsNodeInfo *)node)->path != NULL) { + if (mf_fm_svc_wrapper_get_location(node->path) == location){ + SAFE_FREE_CHAR(node->path); + SAFE_FREE_CHAR(node->name); + SAFE_FREE_CHAR(node->ext); + SAFE_FREE_CHAR(node); + *list = eina_list_remove_list(*list, l); + } + } + } +} + +void mf_util_update_item_from_list_by_name(Eina_List **list, const char *path, char *new_name) +{ + mf_retm_if(list == NULL, "list is NULL"); + + Eina_List *l = NULL; + fsNodeInfo *node = NULL; + + EINA_LIST_FOREACH(*list, l, node) { + if ((fsNodeInfo *)node != NULL && ((fsNodeInfo *)node)->name != NULL && ((fsNodeInfo *)node)->path != NULL) { + char *real_name = g_strconcat(((fsNodeInfo *)node)->path, "/", ((fsNodeInfo *)node)->name, NULL); + mf_debug("real is [%s] path is [%s]", real_name, path); + if (g_strcmp0(real_name, path) == 0){ + SAFE_FREE_CHAR(node->name); + node->name = g_strdup(ecore_file_file_get(new_name)); + } + SAFE_FREE_CHAR(real_name); + } + } +} + +void mf_util_remove_item_from_list_by_name(Eina_List **list, const char *path) +{ + mf_retm_if(list == NULL, "list is NULL"); + + Eina_List *l = NULL; + fsNodeInfo *node = NULL; + + EINA_LIST_FOREACH(*list, l, node) { + if ((fsNodeInfo *)node != NULL && ((fsNodeInfo *)node)->name != NULL && ((fsNodeInfo *)node)->path != NULL) { + char *real_name = g_strconcat(((fsNodeInfo *)node)->path, "/", ((fsNodeInfo *)node)->name, NULL); + mf_debug("real is [%s] path is [%s]", real_name, path); + if (g_strcmp0(real_name, path) == 0){ + SAFE_FREE_CHAR(node->path); + SAFE_FREE_CHAR(node->name); + SAFE_FREE_CHAR(node->ext); + SAFE_FREE_CHAR(node); + *list = eina_list_remove_list(*list, l); + } + SAFE_FREE_CHAR(real_name); + } + } +} + +bool mf_util_is_rotation_lock(void) +{ + MF_TRACE_BEGIN; + int lock = -1; + + if (!vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &lock)) + { + mf_debug("Rotation locked state[%d].", lock); + return lock; + } + else + { + mf_debug("Get rotation lock state failed!"); + return false; + } +} + diff --git a/src/include/mf-callback.h b/src/include/mf-callback.h new file mode 100644 index 0000000..8a25b4f --- /dev/null +++ b/src/include/mf-callback.h @@ -0,0 +1,126 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_CALLBACK_H_ +#define __DEF_MYFILE_CALLBACK_H_ + +#include "mf-main.h" + +void mf_callback_click_cb(struct appdata *data, mfAction key, GString * path); +void mf_callback_app_rotate_cb(app_device_orientation_e , void *data); +//void mf_callback_tab_cb(void *data, Evas_Object *obj, void *event_info); +void mfNaviBackStatusSet(void *data, Evas_Object *obj, void *event_info); +void mfListByCB(void *data, Evas_Object *obj, void *event_info); +void mf_callback_launch_send_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_cancel_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_edit_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_save_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_rename_save_cb(void *ad, Evas_Object * obj, void *event_info); +void mf_callback_delete_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_max_len_reached_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_new_folder_create_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_list_by_view_cb(void *data, Evas_Object *obj, void *event_info); +void mfMoveCB(void *data, Evas_Object * obj, void *event_info); +void mf_callback_copy_move_cb(void *data, Evas_Object *obj, void *event_info); +void mfSearchbarCancelCallBack(void *data, Evas_Object *obj, void *event_info); + +void mf_callback_move_here_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_paste_here_cb(void *data, Evas_Object *obj, void *event_info); +void mfCopyCB(void *data, Evas_Object *obj, void *event_info); +Eina_Bool mf_callback_thumb_timer_cb(void *data); + +/*Callbacks defined for external usage*/ + +int refresh_timer_cb(void *data); +void mfSendViaCB(void *data, Evas_Object *obj, void *event_info); + +int mf_callback_set_mmc_state_cb(void *data); +int mf_callback_add_dir_watch(const char *path, void *data); +int mf_callback_remove_dir_watch(void); +int mf_callback_create_dir_monitor(void *data); +void mf_callback_destory_dir_monitor(void *data); + +void mf_callback_init_operation_cancel(void *data); +void mf_callback_progress_bar_cancel_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_thread_pipe_cb(void *data, void *buffer, unsigned int nbyte); +void mf_callback_icu_update_cb(void *data); +void mf_callback_exception_popup_cb(void *data); +void mf_callback_destory_rename(void *data); +void mf_popup_show_vk_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_backbutton_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_upper_button_pressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_upper_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_upper_click_cb(void *data, Evas_Object * obj, void *event_info); +int mf_callback_set_mass_storage_state_cb(void *data); +#ifdef MYFILE_USB_OTG +void mf_callback_set_otg_state_cb(void *data); +#endif +void mf_callback_rename_button_callback(void *data, Evas_Object * obj, void *event_info); +void mf_callback_delete_button_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_imf_changed_cb(void *data, Evas_Object *obj, void *event_info); +Eina_Bool mf_callback_gengrid_thumb_timer_cb(void *data); +void mf_callback_view_style_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_home_button_pressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_home_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_home_button_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_more_button_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +void mf_callback_list_by_response_cb(void *data); +void mf_callback_send_response_cb(void *data); + +void mf_callback_operation_request_cancel_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_operation_request_replace_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_operation_request_rename_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_list_by_button_callback(void *data, Evas_Object * obj, void *event_info); +void mf_callback_view_as_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_rename_create_cb(void *data, Evas_Object * obj, void *event_info); +#ifdef MYFILE_SPLIT_VIEW +void mf_callback_left_click_cb(struct appdata *data, GString * path, Elm_Object_Item *item); +#endif +void mf_callback_new_folder_changed_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_sbeam_cb(void *user_data); +void mf_callback_extension_cb(void *data, Evas_Object * obj, void *event_info); +Eina_Bool mf_callback_popup_del_idler_cb(void *data); +void mf_callback_operation_timeout_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_nofity_show_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); +void mf_callback_nofity_hide_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); +#ifdef MYFILE_MOTION_FEATURE +void mf_callback_motion_double_tap(Evas_Object *genlist); +#endif +void mf_callback_detail_ctx_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_profile_changed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_share_cb(void *data, Evas_Object * obj, void *event_info); + +void mf_callback_thumb_created_cb(media_content_error_e error, const char *path, void *user_data); +bool mf_callback_create_thumbnail(void *data, media_thumbnail_completed_cb callback); +void mf_callback_entry_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_imf_preedit_change_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_select_all_button_pressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_select_all_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_imf_hide_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_naviframe_title_clicked_cb(void *data, Evas_Object *obj, void *event_info); +void mf_callback_entry_button_pressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_entry_button_unpressed_cb(void *data, Evas_Object * obj, void *event_info); +void mf_callback_storage_remove_view_operation(void *data, int optStorage); +void mf_callback_storage_remove_category_view_items(void *data, int optStorage); +void mf_callback_imf_state_callback_register(void *data); +void mf_callback_imf_state_callback_del(void *data); +void mf_callback_illegal_char_popup_cb(void *data, Evas_Object * obj, void *event_info); + +#endif diff --git a/src/include/mf-cancel.h b/src/include/mf-cancel.h new file mode 100644 index 0000000..5fae676 --- /dev/null +++ b/src/include/mf-cancel.h @@ -0,0 +1,83 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef _MF_CANCEL_DEF_H_ +#define _MF_CANCEL_DEF_H_ + +#include + +/** + * mf_cancel: + * mf_cancel is an opaque structure whose members + * cannot be accessed directly. + */ +typedef struct _mf_cancel mf_cancel; + +struct _mf_cancel { + gboolean is_cancel; + gboolean do_cancel; + GStaticMutex s_mutex; +}; + +/** + * mf_cancel_new: + * Creates a new #mf_cancel. + * Return value: This function returns a new #mf_cancel on success, or %NULL. + **/ +mf_cancel *mf_cancel_new(void); + +/** + * mf_cancel_free: + * @cancel : a #mf_cancel + * Release all allocated memory for @cancel. + **/ +void mf_cancel_free(mf_cancel *cancel); + +/** + * mf_cancel_do_cancel: + * @cancel : a #mf_cancel + * Request to cancel operation related on @cancel. + * This function should be called by conductor at most case + **/ +void mf_cancel_do_cancel(mf_cancel *cancel); + +/** + * mf_cancel_check_cancel: + * Check request of @cancel + * Return value: This function returns TRUE, if cancel is requested, or FALSE. + **/ +gboolean mf_cancel_check_cancel(mf_cancel *cancel); + +/** + * mf_cancel_is_cancelled: + * Check status of @cancel + * Return value: This function returns TRUE, if cancel is done, or FALSE. + **/ +gboolean mf_cancel_is_cancelled(mf_cancel *cancel); + + +/** + * mf_cancel_set_cancelled: + * set status of @cancel after cancel is done + * This function should be called by operator + **/ +void mf_cancel_set_cancelled(mf_cancel *cancel); + +#endif diff --git a/src/include/mf-conf.h b/src/include/mf-conf.h new file mode 100644 index 0000000..ff2a0c7 --- /dev/null +++ b/src/include/mf-conf.h @@ -0,0 +1,65 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef __DEF_MYFILE_CONF_H_ +#define __DEF_MYFILE_CONF_H_ + + +#define PACKAGE "myfile" +#define PKGNAME_MYFILE "org.tizen.myfile" +#define LOCALEDIR "/usr/apps/org.tizen.myfile/res/locale" + +#define EDJ_PATH "/usr/apps/org.tizen.myfile/res/edje" +#define ICON_PATH "/usr/apps/org.tizen.myfile/res/images" + +#define EDJ_NAVIGATIONBAR EDJ_PATH"/myfileNavigationBar.edj" +#define GRP_NAVI_VIEW "navigation_view" + +#define EDJ_SEARCHBAR EDJ_PATH"/myfileSearchBar.edj" +#define GRP_SEARCH_BAR "search_bar" + +#define EDJ_NAME EDJ_PATH"/myfile.edj" +#define GRP_LIST "effect/model/list" +#define GRP_THUMBNAIL_ONLY "thumbnail_only" +#define GRP_PROGRESS_LABEL "label" +#define GRP_NO_CONTENT "noContent" +#define GRP_PATH_INFO "pathinfo" +#define GRP_UPPER_FOLDER "upper_folder" +#define GRP_SEARCH_VIEW "search_view" +#ifdef MYFILE_SPLIT_VIEW +#define GRP_UPPER_FOLDER "upper_folder" +#define GRP_PATH_INFO_LANSCAPE "pathinfo_lanscape" +#define GRP_UPPER_FOLDER_LANSCAPE "upper_folder_lanscape" +#define GRP_LANDSCAPE_LAYOUT "landscape_layout" +#endif +#define GRP_NEW_FOLDER "new_folder_layout" +#define GRP_TRAY_ITEM "apptray.item" + +#define MYFILE_DATEFORMAT_12 "MM/dd/yyyyhm" +#define MYFILE_DATEFORMAT_24 "MM/dd/yyyyHm" + + +#define MYFILE_LABEL_STRING_LENGTH 128 + +#define MYFILE_ICU_ARR_LENGTH 128 +#define BUFF_SIZE 256 +#define MYFILE_BASIC_SIZE 1024 +#define MAX_FOLDER_COUNT 300 +#endif /* __DEF_MYFILE_CONF_H_ */ diff --git a/src/include/mf-copy-internal.h b/src/include/mf-copy-internal.h new file mode 100644 index 0000000..0fd631d --- /dev/null +++ b/src/include/mf-copy-internal.h @@ -0,0 +1,42 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef __MF_COPY_INTERNAL_H_DEF__ +#define __MF_COPY_INTERNAL_H_DEF__ + +#include +#include +#include +#include "mf-cancel.h" +#include "mf-request.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" + +int _mf_copy_copy_regfile(const char *src, struct stat *src_statp, + const char *dst, unsigned long buf_size, mf_cancel * cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + + +int _mf_copy_copy_directory(const char *src, struct stat *src_statp, const char *dst, mf_cancel * cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + +int _mf_copy_copy_internal(const char *src, const char *dst_dir, + mf_cancel *cancel, _mf_fo_msg_cb msg_func, mf_req_callback req_func, void *msg_data); + + +#endif diff --git a/src/include/mf-copy.h b/src/include/mf-copy.h new file mode 100644 index 0000000..2360c26 --- /dev/null +++ b/src/include/mf-copy.h @@ -0,0 +1,51 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_COPY_H_DEF__ +#define __MF_COPY_H_DEF__ + +#include +#include "mf-cancel.h" +#include "mf-request.h" +#include "mf-fo-common.h" + +/** + * mf_copy_copy_items: + * @item_list: a GList of strings containing item path to copy + * @dst_dir: destination directory to copy + * @request_callback: callback to handle duplicated file/directory name, + * if NULL is set for requset_callback, default action is merge. + * for detail, see "mf_request.h" + * @msg_callback: callback for reporting progress, for detail, see "mf_fo_common.h" + * @cancel : a handle for cancelling copy operation, for detail, see "mf_cancel.h" + * @sync: a variable for requesting file system sync, if TRUE is set, sync() function is called after copy done. + * @u_data: user data + * + * Start copy items in given @item_list to @dst_dir, @msg_callback will be called repeatly with @u_data + * in certain interval to report current progress. + * if duplicated file/directory is found, @request_callback is called with @u_data, + * and copy operation will be blocked until user's decision is decided. + * if someone want to cancel operation, call mf_cancel_do_cancel() with @cancel. + * if @sync is set TRUE, sync() function is called after copy operation is done to flush out file system cache. + * Return value: This function returns zero on success, or negative value. + **/ + +int mf_copy_copy_items(GList *item_list, const char *dst_dir, mf_cancel *cancel, gboolean sync, void *u_data); + +#endif diff --git a/src/include/mf-delete-internal.h b/src/include/mf-delete-internal.h new file mode 100644 index 0000000..5f474cf --- /dev/null +++ b/src/include/mf-delete-internal.h @@ -0,0 +1,36 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_DELETE_INTERNAL_H_DEF__ +#define __MF_DELETE_INTERNAL_H_DEF__ + +#include +#include +#include +#include "mf-cancel.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" + +int _mf_delete_delete_regfile(const char *file, struct stat *file_statp, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + +int _mf_delete_delete_directory(const char *dir, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + +int _mf_delete_del_internal(const char *item, mf_cancel *cancel, _mf_fo_msg_cb msg_callback, void *msg_data); + +#endif diff --git a/src/include/mf-delete.h b/src/include/mf-delete.h new file mode 100644 index 0000000..9984a1d --- /dev/null +++ b/src/include/mf-delete.h @@ -0,0 +1,45 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_DELETE_H_DEF__ +#define __MF_DELETE_H_DEF__ + +#include + +#include "mf-cancel.h" +#include "mf-fo-common.h" + +/** + * mf_delete_items: + * @item_list: a GList of strings containing item path to delete + * @msg_callback: callback for reporting progress, for detail, see "mf_fo_common.h" + * @cancel : a handle for cancelling delete operation, for detail, see "mf_cancel.h" + * @sync: a variable for requesting file system sync, if TRUE is set, sync() function is called after delete done. + * @u_data: user data + * + * Start delete items in given @item_list, @msg_callback will be called repeatly with @u_data + * in certain interval to report current progress. + * if someone want to cancel operation, call mf_cancel_do_cancel() with @cancel. + * if @sync is set TRUE, sync() function is called after delete operation is done to flush out file system cache. + * Return value: This function returns zero on success, or negative value. + **/ + +int mf_delete_items(GList *item_list, mf_cancel *cancel, gboolean sync, void *u_data); + +#endif diff --git a/src/include/mf-dlog.h b/src/include/mf-dlog.h new file mode 100644 index 0000000..dc002e6 --- /dev/null +++ b/src/include/mf-dlog.h @@ -0,0 +1,116 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef __MYFILE_DEBUG_H_ +#define __MYFILE_DEBUG_H_ + +#include +#include +#include "mf-log.h" + +#ifdef MYFILE_USE_LOG + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "MYFILES" +#include +#define LOG_COLOR_RED "\033[31m" +#define LOG_COLOR_RESET "\033[0m" + +#define MYFILE_TRACE_DEBUG(fmt, arg...) do { LOGD("[%s][%d] "fmt "\n", __FILE__, __LINE__, ##arg); } while (0) +#define MYFILE_TRACE_ERROR(fmt, arg...) do { LOGE("[%s][%d] "fmt"\n", strrchr(__FILE__, '/')+1, __LINE__, ##arg); } while (0) + +#define mf_func_line() do { LOGD("[%s][%s][%d] \n", __FILE__, __func__, __LINE__); } while (0) +#define mf_debug(fmt, args...) do { LOGD("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) + +#define mf_error(fmt, arg...) LOGE(LOG_COLOR_RED"[ %s : %d] "fmt""LOG_COLOR_RESET, __FUNCTION__, __LINE__,##arg) +#define mf_warnig(fmt, args...) do { LOGW("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_info(fmt, args...) do { LOGI("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_assert(fmt, args...) do { LOGE("[ASSERT][%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) + +#else + +#define MYFILE_TRACE_DEBUG(fmt, arg...) do { printf("%s:%d: " fmt "\n", __FILE__, __LINE__, ##arg); } while (0) +#define MYFILE_TRACE_ERROR(fmt, arg...) do { printf("[%s][%d] "fmt"\n", strrchr(__FILE__, '/')+1, __LINE__, ##arg); } while (0) + +#define mf_debug(fmt, args...) do { printf("[MYFILE][D][%40s:%4d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_func_line() do { printf("[MYFILE][D][%40s:%4d] \n", __FILE__, __func__, __LINE__); } while (0) +#define mf_error(fmt, args...) do { \ + printf("[MYFILE][E][%40s:%4d] "fmt"\n", __func__, __LINE__, ##args); \ + MF_LOG_RECORD(fmt,##args); \ + } while (0) +#define mf_warnig(fmt, args...) do { printf("[MYFILE][W][%40s:%4d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_info(fmt, args...) do { printf("[MYFILE][I][%40s:%4d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_assert(fmt, args...) do { printf("[MYFILE][A][%40s:%4d] "fmt"\n", __func__, __LINE__, ##args); } while (0) + +#endif + +#define mf_retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + MYFILE_TRACE_ERROR(fmt, ##arg); \ + MF_LOG_RECORD(fmt,##arg); \ + return (val); \ + } \ + } while (0) + +#define mf_retv_if(expr, val) do { \ + if (expr) { \ + return (val); \ + } \ + } while (0) + + +#define mf_retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + MYFILE_TRACE_ERROR(fmt, ##arg); \ + MF_LOG_RECORD(fmt,##arg); \ + return; \ + } \ + } while (0) + +#define mf_ret_if(expr, fmt, arg...) do { \ + if (expr) { \ + MF_LOG_RECORD(fmt,##arg); \ + return; \ + } \ + } while (0) + +#define MF_TRACE_BEGIN do {\ + {\ + LOGD("\n\033[0;35mENTER FUNCTION: %s. \033[0m\t%s:%d\n", \ + __FUNCTION__, (char *)(strrchr(__FILE__, '/')+1), __LINE__);\ + } \ + } while (0) ; + +#define MF_TRACE_END do {\ + {\ + LOGD("\n\033[0;35mEXIT FUNCTION: %s. \033[0m\t%s:%d\n", \ + __FUNCTION__, (char *)(strrchr(__FILE__, '/')+1), __LINE__);\ + } \ + } while (0) ; + +#define MF_CHECK(expr) mf_retm_if(!(expr),"INVALID PARAM RETURN") +#define MF_CHECK_FALSE(expr) mf_retvm_if(!(expr),FALSE,"INVALID PARM RETURN FALSE") +#define MF_CHECK_VAL(expr, val) mf_retvm_if(!(expr),val,"INVALID PARM RETURN NULL") +#define MF_CHECK_NULL(expr) mf_retvm_if(!(expr),NULL,"INVALID PARM RETURN NULL") + +#endif /* end of __MYFILE_DEBUG_H_ */ diff --git a/src/include/mf-drm.h b/src/include/mf-drm.h new file mode 100644 index 0000000..76a0975 --- /dev/null +++ b/src/include/mf-drm.h @@ -0,0 +1,34 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __MF_DRM_H__ +#define __MF_DRM_H__ + +typedef enum __drm_file_mime_type_e drm_file_mime_type_e; +enum __drm_file_mime_type_e { + MYFILE_DRM_UNKNOW_FILE = 0, + MYFILE_DRM_IMAGE_FILE, + MYFILE_DRM_RINGTONE_FILE, + MYFILE_DRM_VIDEO_FILE, + MYFILE_DRM_FILE_MAX +} ; + +int mf_drm_is_converted_fl(char *path); +int mf_drm_is_drm_file(const char *file_fullpath); +drm_file_mime_type_e mf_drm_check_drm_mime_type(char *mime_type); + +#endif diff --git a/src/include/mf-fm-svc-wrapper.h b/src/include/mf-fm-svc-wrapper.h new file mode 100644 index 0000000..5f59cf4 --- /dev/null +++ b/src/include/mf-fm-svc-wrapper.h @@ -0,0 +1,81 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_FILEMANAGERSERVICE_WRAPPER_H_ +#define __DEF_MYFILE_FILEMANAGERSERVICE_WRAPPER_H_ + +#include +#include +#include "mf-main.h" +#include "mf-conf.h" + +#include +#include + +#define MF_TRANSLATE_LENGTH 40 +#define MF_TRANSLATE_OMIT_PART "/.../" +#define MF_PATH_INFO_MAX_LENGTH_PORTRAIT 35 +#define MF_PATH_INFO_MAX_LENGTH_LANDSCAPE 55 + +typedef enum _TRANS_OPTION MF_TRANS_OPTION; + +enum _TRANS_OPTION { + MF_TRANS_OPTION_NONE = 0, + MF_TRANS_OPTION_POPUP, + MF_TRANS_OPTION_LABEL, + MF_TRANS_OPTION_MAX, +} ; + +/* basis file managing. create/rename/move/copy/rename */ +int mf_fm_svc_wrapper_create_service(void *data, GString *fullpath); +int mf_fm_svc_wrapper_rename_service(void *data, GString *from_fullpath, GString *to_name); + + +int mf_fm_svc_wrapper_get_file_list(const char *folder_name, Eina_List **dir_list, Eina_List **file_list); +int mf_fm_svc_wrapper_classify_dir_list(Eina_List *dir_list, Eina_List **default_dir_list, Eina_List **user_dir_list); + +char *mf_fm_svc_wrapper_get_root_path_by_tab_label(const char *label); +/* file information get/set */ +GString *mf_fm_svc_wrapper_get_file_name(GString *path); +int mf_fm_svc_wrapper_get_location(const char *fullpath); +unsigned long mf_fm_svc_wrapper_get_free_space(int state); +gint mf_fm_svc_wrapper_get_folder_foldersystem(GString *path, bool *result); +int file_createdate_get(GString *path); +gboolean mf_fm_svc_wrapper_is_dir(GString *path); +int file_filesize_get(GString *path); +int file_index_get(GString *path); +int file_location_get(GString *path); +bool mf_fm_svc_wrapper_detect_duplication(GString *to); +GString *mf_fm_svc_wrapper_get_file_parent_path(GString *fullpath); +int mf_fm_svc_wrapper_file_auto_rename(void *data, GString *fullpath, int file_name_type, GString **filename); +int file_MMC_status(); +int mf_fm_svc_wrapper_detect_recursion(GString *from, GString *to); +bool is_file_existing(const char *file_full_path); +int mf_fm_svc_wrapper_is_root_path(const char *fullpath); + +bool get_phone_status(int *value); +int drm_launch(void *data, const char *path); +char *mf_fm_svc_wrapper_translate_path(const char *original_path, MF_TRANS_OPTION option); +gboolean mf_fm_svc_is_mass_storage_on(); +char *mf_fm_svc_path_info_get(const char *original_path); +char *mf_fm_svc_path_info_translate(char *path_info, int path_info_max_len); +char *mf_fm_svc_get_file_name(GString *path); +char *mf_fm_svc_get_file_name_without_ext(const char *name); + +#endif diff --git a/src/include/mf-fo-common.h b/src/include/mf-fo-common.h new file mode 100644 index 0000000..ec8ade2 --- /dev/null +++ b/src/include/mf-fo-common.h @@ -0,0 +1,126 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_FO_COMMON_H_DEF__ +#define __MF_FO_COMMON_H_DEF__ +#include + + +#include "mf-request.h" +#include "mf-fo-debug.h" + +#define MYFILE_MAGIC_MAIN_CONTEXT (0x1983cdaf) +#define MYFILE_MAGIC_DETAIL_LIST_ITEM (0x1977abcd) +#define MYFILE_MAGIC_PIPE_DATA (0x0716ffcc) + +#define MYFILE_MAGIC unsigned int __magic +#define MYFILE_MAGIC_SET(d, m) (d)->__magic = (m) +#define MYFILE_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m))) +#define FO_ERROR_CHECK(x) ((x)&0x000000FF) + +#define MF_VISUAL_FOLDER_SIZE 16 /*used only for the progress bar, + if the file system is different, the folder size is diff, fat is 4k and fat32 is 16k*/ +#define MF_ERR_BUF 256 + +#define MF_FILE_ERROR_LOG(buf, fmt, arg) do { \ + {\ + if (strerror_r(errno, buf, MF_ERR_BUF) == 0 ) { \ + mf_fo_logd(fmt": [%s] error is [%s] \n", (arg), (buf)); \ + } else { \ + mf_fo_logd(fmt": [%s] \n", (arg)); \ + }\ + }\ + } while (0) +typedef enum _msg_type mf_msg_type; + +enum _msg_type { + MF_MSG_NONE, + MF_MSG_DOING, + MF_MSG_SKIP, + MF_MSG_SYNC, + MF_MSG_REQUEST, + MF_MSG_ERROR, + MF_MSG_END, + MF_MSG_CANCELLED, +} ; + + +typedef struct __mf_fo_dir_list_info mf_fo_dir_list_info; + +struct __mf_fo_dir_list_info { + char *ftw_path; + unsigned long long size; + int type; +}; + + +typedef struct _mf_fo_msg mf_fo_msg; + +struct _mf_fo_msg { + MYFILE_MAGIC; + mf_msg_type msg_type; + int error_code; + unsigned long long total_size; + unsigned long long current_size; + unsigned int total_index; + unsigned int current_index; + const char *current; + char *current_real; + mf_fo_request *request; + Ecore_Pipe *pipe; +}; + +typedef void (*mf_msg_callback) (mf_fo_msg *msg, void *data); + +enum { + MF_FO_ERR_NONE = 0, + MF_FO_ERR_PERMISSION = 1, + MF_FO_ERR_ARGUMENT = 2, + MF_FO_ERR_FAULT = 3, + MF_FO_ERR_TYPE = 4, + MF_FO_ERR_MAX_OPEN = 5, + MF_FO_ERR_SPACE = 6, + MF_FO_ERR_RO = 7, + MF_FO_ERR_LOOP = 8, + MF_FO_ERR_MEM = 9, + MF_FO_ERR_NOT_EXIST = 10, + MF_FO_ERR_LONG_NAME = 11, + MF_FO_ERR_BIG_SIZE = 12, + MF_FO_ERR_IO = 13, + MF_FO_ERR_UNKNOWN = 254, + MF_FO_ERR_MAX = 255, +}; + + +#define MF_FO_ERR_COMMON_CLASS (0x0800) +#define MF_FO_ERR_SRC_CLASS (0x0400) +#define MF_FO_ERR_DST_CLASS (0x0200) +#define MF_FO_ERR_REPORT_CLASS (0x0100) + +#define E_IS_SRC(err) ((err)&MF_FO_ERR_SRC_CLASS) +#define E_IS_DST(err) ((err)&MF_FO_ERR_DST_CLASS) +#define E_IS_COMMON(err) ((err)&MF_FO_ERR_COMMON_CLASS) +#define E_IS_REPORTABLE(err) ((err)&MF_FO_ERR_REPORT_CLASS) + +#define E_GET_CLASS(err) ((err)&0x0F00) +#define E_GET_DETAIL(err) ((err)&0x00FF) + +#define MF_FO_ERR_SET(x) (((x) & 0x0FFF) | 0xFFFFF000) + +#endif diff --git a/src/include/mf-fo-debug.h b/src/include/mf-fo-debug.h new file mode 100644 index 0000000..aa75300 --- /dev/null +++ b/src/include/mf-fo-debug.h @@ -0,0 +1,68 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef __MF_FO_DEBUG_H_ +#define __MF_FO_DEBUG_H_ + +#ifdef MYFILE_USE_LOG +#include +#include +#include +#include + +#define mf_fo_logd(fmt , args...) do { LOGD("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_fo_loge(fmt , args...) do {\ + LOGE("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); \ + MF_LOG_RECORD(fmt,##args); \ + } while (0) +#define mf_fo_logw(fmt , args...) do { LOGW("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_fo_logi(fmt , args...) do { LOGI("[%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define mf_fo_loga(fmt , args...) do { LOGE("[ASSERT][%s][%d] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define FO_TRACE_BEGIN do {\ + {\ + LOGD("\n\033[0;35mENTER FUNCTION: %s. \033[0m\t%s:%d\n", \ + __FUNCTION__, (char *)(strrchr(__FILE__, '/')+1), __LINE__);\ + } \ + } while (0) ; + +#define FO_TRACE_END do {\ + {\ + LOGD("\n\033[0;35mEXIT FUNCTION: %s. \033[0m\t%s:%d\n", \ + __FUNCTION__, (char *)(strrchr(__FILE__, '/')+1), __LINE__);\ + } \ + } while (0) ; + +#else +#include +#include +#define mf_fo_logd(fmt , args...) do { printf("[%ld][D][%20s:%4d] "fmt"\n", syscall(__NR_gettid), __func__, __LINE__, ##args); } while (0) +#define mf_fo_loge(fmt , args...) do {\ + printf("[%ld][E][%20s:%4d] "fmt"\n", syscall(__NR_gettid), __func__, __LINE__, ##args);\ + MF_LOG_RECORD(fmt,##args); \ + } while (0) +#define mf_fo_logw(fmt , args...) do { printf("[%ld][W][%20s:%4d] "fmt"\n", syscall(__NR_gettid), __func__, __LINE__, ##args); } while (0) +#define mf_fo_logi(fmt , args...) do { printf("[%ld][I][%20s:%4d] "fmt"\n", syscall(__NR_gettid), __func__, __LINE__, ##args); } while (0) +#define mf_fo_loga(fmt , args...) do { printf("[%ld][A][%20s:%4d] "fmt"\n", syscall(__NR_gettid), __func__, __LINE__, ##args); } while (0) + +#endif + + + +#endif /* end of __MF_FO_DEBUG_H_ */ diff --git a/src/include/mf-fo-internal.h b/src/include/mf-fo-internal.h new file mode 100644 index 0000000..58e5e96 --- /dev/null +++ b/src/include/mf-fo-internal.h @@ -0,0 +1,39 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_FO_INTERNAL_H_DEF__ +#define __MF_FO_INTERNAL_H_DEF__ + +#include +#include +#include "mf-fo-common.h" +#include "mf-util.h" + +typedef void (*_mf_fo_msg_cb) (mf_msg_type msg_type, const char *real, unsigned long long size, int error_code, void *data); + +inline bool _mf_fo_check_exist(const char *path); +char *_mf_fo_get_next_unique_dirname(const char *name, int *errcode); +char *_mf_fo_get_next_unique_filename(const char *name, int *errcode); +int _mf_fo_get_total_item_size(const char *item, unsigned long long *size); +int _mf_fo_get_remain_space(const char *path, unsigned long long *size); + +int _mf_fo_errno_to_mferr(int err_no); +void _mf_fo_free_directory_hierarchies(GSList **glist); + +#endif diff --git a/src/include/mf-fs-util.h b/src/include/mf-fs-util.h new file mode 100644 index 0000000..7eb90d7 --- /dev/null +++ b/src/include/mf-fs-util.h @@ -0,0 +1,414 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef _MYFILE_FILESYSTEM_UTIL_H_ +#define _MYFILE_FILESYSTEM_UTIL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "mf-dlog.h" + +/* File system related value definition */ +#define MYFILE_FILE_NAME_LEN_MAX 255 /*charactor based, use g_utf8_strlen to check length*/ +#define MYFILE_FILE_PATH_LEN_MAX 4096 /*charactor based, use g_utf8_strlen to check length*/ +#define MYFILE_REPORT_SIZE 16384 + +#define MYFILE_FOLDER_SIZE 0; + +/* File system related String definition */ +#define PHONE_FOLDER "/opt/usr/media" +#define MEMORY_FOLDER "/opt/storage/sdcard" +#define PHONE_PARENT "/opt/usr" +#define PHONE_NAME "media" +#define STORAGE_PARENT "/opt/storage" +#define MMC_NAME "sdcard" + +#ifdef MYFILE_USB_OTG +#define OTG_FOLDER "/opt/storage/usb" +#define OTG_NAME "usb" +#endif + + +#define DEBUG_FOLDER "SLP_debug" + +#define MYFILE_NAME_PATTERN "[\\:;*\"<>|?/]" + +/* File system define default folder */ + +#define DEFAULT_FOLDER_CAMERA_SHOTS "Camera shots" +#define DEFAULT_FOLDER_DOWNLOADS "Downloads" + +#define DEFAULT_FOLDER_IMAGE "Images" +#define SUB_FODER_WALLPAPER "Wallpapers" + +#define DEFAULT_FOLDER_VIDEO "Videos" + +#define DEFAULT_FOLDER_MUSIC "Music" +#define SUB_FODER_FM "FM radio" +#define SUB_FODER_VOICE_RECORD "Voice recorder" + +#define DEFAULT_FOLDER_ALERTS_AND_RINGTONES "Alerts and ringtones" +#define SUB_FODER_ALERTS "Alerts" +#define SUB_FODER_RINGTONES "Ringtones" + +#define DEFAULT_FOLDER_BOOKMARK "Bookmark" +#define DEFAULT_FOLDER_RSS "RSS" + +#ifndef ICON_PATH +#define ICON_PATH "/usr/apps/org.tizen.myfile/res/images" +#endif + +#ifndef DEFAULT_ICON +#define DEFAULT_ICON ICON_PATH"/myfile_icon_etc.png" +#endif + +#define MF_ICON_FOLDER ICON_PATH"/myfile_icon_folder.png" +#define MF_ICON_FOLDER_OPEN ICON_PATH"/myfile_icon_folder_open.png" +#define MF_ICON_IMAGE ICON_PATH"/myfile_icon_images.png" +#define MF_ICON_VIDEO ICON_PATH"/myfile_icon_video.png" +#define MF_ICON_MUSIC ICON_PATH"/myfile_icon_music.png" +#define MF_ICON_SOUND ICON_PATH"/myfile_icon_music.png" +#define MF_ICON_PDF ICON_PATH"/myfile_icon_pdf.png" +#define MF_ICON_DOC ICON_PATH"/myfile_icon_word.png" +#define MF_ICON_PPT ICON_PATH"/myfile_icon_ppt.png" +#define MF_ICON_EXCEL ICON_PATH"/myfile_icon_excel.png" +#define MF_ICON_VOICE ICON_PATH"/myfile_icon_music.png" +#define MF_ICON_HTML ICON_PATH"/myfile_icon_html.png" +#define MF_ICON_FLASH ICON_PATH"/myfile_icon_swf.png" +#define MF_ICON_TXT ICON_PATH"/myfile_icon_text.png" +#define MF_ICON_VCONTACT ICON_PATH"/myfile_icon_svg.png" +#define MF_ICON_VCALENDAR ICON_PATH"/myfile_icon_svg.png" +#define MF_ICON_VNOTE ICON_PATH"/myfile_icon_text.png" +#define MF_ICON_RSS ICON_PATH"/myfile_icon_rss.png" +#define MF_ICON_JAVA ICON_PATH"/myfile_icon_java.png" +#define MF_ICON_MEMORY_SUB ICON_PATH"/myfile_icon_mmc_sub.png" +#define MF_ICON_MUSIC_PLAY ICON_PATH"/myfile_icon_control_play.png" +#define MF_ICON_MUSIC_PAUSE ICON_PATH"/myfile_icon_control_pause.png" +#define MF_ICON_PHONE ICON_PATH"/myfile_icon_phone.png" +#define MF_ICON_MEMORY ICON_PATH"/myfile_icon_mmc.png" +#define MF_ICON_EXTERNAL_DEVICE ICON_PATH"/myfile_icon_USB.png" +#define MF_ICON_VIDEO_PLAY ICON_PATH"/myfile_icon_video_play.png" +#define MF_ICON_ENTRY_FOLDER ICON_PATH"/myfile_icon_entry_folder.png" +#define MF_ICON_ENTRY_FOLDER_PRESS ICON_PATH"/myfile_icon_entry_folder_press.png" + + + +/************************myfile_5shortcut****************************/ +#define MF_ICON_SHORTCUT_LCIR_BOTOM ICON_PATH"/myfile_icon_shortcut_left.png" +#define MF_ICON_SHORTCUT_RCIR_BOTOM ICON_PATH"/myfile_icon_shortcut_right.png" +#define MF_ICON_SHORTCUT_IMAGE_BOTOM ICON_PATH"/myfile_icon_shortcut_image.png" +#define MF_ICON_SHORTCUT_IMAGE_PRESS_BOTOM ICON_PATH"/myfile_icon_shortcut_image_press.png" +#define MF_ICON_SHORTCUT_VIDEO_BOTOM ICON_PATH"/myfile_icon_shortcut_video.png" +#define MF_ICON_SHORTCUT_VIDEO_PRESS_BOTOM ICON_PATH"/myfile_icon_shortcut_video_press.png" +#define MF_ICON_SHORTCUT_SOUND_BOTOM ICON_PATH"/myfile_icon_shortcut_sound.png" +#define MF_ICON_SHORTCUT_SOUND_PRESS_BOTOM ICON_PATH"/myfile_icon_shortcut_sound_press.png" +#define MF_ICON_SHORTCUT_DOCUMENT_BOTOM ICON_PATH"/myfile_icon_shortcut_document.png" +#define MF_ICON_SHORTCUT_DOCUMENT_PRESS_BOTOM ICON_PATH"/myfile_icon_shortcut_document_press.png" +#define MF_ICON_SHORTCUT_OTHERS_BOTOM ICON_PATH"/myfile_icon_shortcut_others.png" +#define MF_ICON_SHORTCUT_OTHERS_PRESS_BOTOM ICON_PATH"/myfile_icon_shortcut_others_press.png" +/*****************************************************************/ + + +#define MF_ICON_THUMBNAIL_EXCEL ICON_PATH"/myfile_thumbnail_icon_excel.png" +#define MF_ICON_THUMBNAIL_FOLDER ICON_PATH"/myfile_thumbnail_icon_folder.png" +#define MF_ICON_THUMBNAIL_FOLDER_OPEN ICON_PATH"/myfile_thumbnail_icon_folder_open.png" +#define MF_ICON_THUMBNAIL_HTML ICON_PATH"/myfile_thumbnail_icon_html.png" +#define MF_ICON_THUMBNAIL_MUSIC ICON_PATH"/myfile_thumbnail_icon_music.png" +#define MF_ICON_THUMBNAIL_PDF ICON_PATH"/myfile_thumbnail_icon_pdf.png" +#define MF_ICON_THUMBNAIL_PPT ICON_PATH"/myfile_thumbnail_icon_ppt.png" +#define MF_ICON_THUMBNAIL_RINGTONE ICON_PATH"/myfile_thumbnail_icon_ring tone.png" +#define MF_ICON_THUMBNAIL_RSS ICON_PATH"/myfile_thumbnail_icon_rss.png" +#define MF_ICON_THUMBNAIL_FLASH ICON_PATH"/myfile_thumbnail_icon_swf.png" +#define MF_ICON_THUMBNAIL_TXT ICON_PATH"/myfile_thumbnail_icon_text.png" +#define MF_ICON_THUMBNAIL_VIDEO ICON_PATH"/myfile_thumbnail_icon_video.png" +#define MF_ICON_THUMBNAIL_DOC ICON_PATH"/myfile_thumbnail_icon_word.png" +#define MF_ICON_THUMBNAIL_VIDEO_PLAY ICON_PATH"/myfile_thumbnail_icon_video_play.png" +#define MF_ICON_THUMBNAIL_UNKOWN ICON_PATH"/myfile_thumbnail_icon_unkown.png" + +#define MF_ICON_ITEM_PHONE ICON_PATH"/U01_1st_icon_phone.png" +#define MF_ICON_ITEM_MMC ICON_PATH"/U01_1st_icon_memory_card.png" +#define MF_ICON_ITEM_OTG ICON_PATH"/U01_1st_icon_external_storage.png" +#define MF_ICON_ITEM_DB ICON_PATH"/U01_1st_icon_dropbox.png" + +typedef enum _SORT_OPTION fsSortOption; + +enum _SORT_OPTION { + MYFILE_SORT_BY_NONE = 0, /**< Sort by default */ + MYFILE_SORT_BY_NAME_A2Z, /**< Sort by file name ascending */ + MYFILE_SORT_BY_SIZE_S2L, /**< Sort by file size ascending */ + MYFILE_SORT_BY_DATE_O2R, /**< Sort by file date ascending */ + MYFILE_SORT_BY_TYPE_A2Z, /**< Sort by file type ascending */ + MYFILE_SORT_BY_NAME_Z2A, /**< Sort by file name descending */ + MYFILE_SORT_BY_SIZE_L2S, /**< Sort by file size descending */ + MYFILE_SORT_BY_DATE_R2O, /**< Sort by file date descending */ + MYFILE_SORT_BY_TYPE_Z2A, /**< Sort by file type descending */ + MYFILE_SORT_BY_MAX +} ; + +typedef enum _mf_extension_state_e mf_extension_state_e; + +enum _mf_extension_state_e { + MF_EXTENSION_NONE = 0, + MF_EXTENSION_SHOW, + MF_EXTENSION_HIDE, + MF_EXTENSION_MAX +} ; + +typedef enum _FILE_TYPE fsFileType; + +enum _FILE_TYPE { + FILE_TYPE_NONE = 0, + FILE_TYPE_DIR, /**< Folder category */ + FILE_TYPE_FILE, /**< File category */ + FILE_TYPE_IMAGE, /**< Image category */ + FILE_TYPE_VIDEO, /**< Video category */ + FILE_TYPE_MUSIC, /**< Music category */ + FILE_TYPE_SOUND, /**< Sound category */ + FILE_TYPE_PDF, /**< Pdf category */ + FILE_TYPE_DOC, /**< Word category */ + FILE_TYPE_PPT, /**< Powerpoint category */ + FILE_TYPE_EXCEL, /**< Excel category */ + FILE_TYPE_VOICE, /**< Voice category */ + FILE_TYPE_HTML, /**< Html category */ + FILE_TYPE_FLASH, /**< Flash category */ + FILE_TYPE_GAME, /**< Game category */ + FILE_TYPE_APP, /**< Application category */ + FILE_TYPE_THEME, /**< Theme category */ + FILE_TYPE_TXT, /**< Txt category */ + FILE_TYPE_VCONTACT, /**< Vcontact category */ + FILE_TYPE_VCALENDAR, /**< Vcalendar category */ + FILE_TYPE_VNOTE, /**< Vnote category */ + FILE_TYPE_VBOOKMARK, /**< Vbookmark category */ + FILE_TYPE_VIDEO_PROJECT, /**< Video editor project category */ + FILE_TYPE_RADIO_RECORDED, /**< radio recorded clips category */ + FILE_TYPE_MOVIE_MAKER, /**< Movie maker project category */ + FILE_TYPE_SVG, /**< Svg category */ + FILE_TYPE_RSS, /**< Rss reader file, *.opml */ + FILE_TYPE_CERTIFICATION, /**< certification file, *.pem */ + FILE_TYPE_JAVA, /**< java file, *.jad, *.jar */ + FILE_TYPE_WGT, /**< wrt , *.wgt, *.wgt */ + FILE_TYPE_DRM, /**< drm file , *.dcf */ + FILE_TYPE_ETC, /**< Other files category */ + FILE_TYPE_MAX +} ; + +typedef enum _STORAGE MF_STORAGE; + +enum _STORAGE { + MYFILE_NONE = 0x00, + MYFILE_PHONE = 0x01, + MYFILE_MMC = 0x02, + MYFILE_OTG = 0x04, + MYFILE_MAX = 0xFF +}; + + +typedef enum _SIZE_TYPE MF_SIZE_TYPE; +enum _SIZE_TYPE { + SIZE_BYTE = 0, + SIZE_KB, + SIZE_MB, + SIZE_GB +}; + +typedef enum __MF_SORT_BY_PRIORITY_SEQUENCE MF_SORT_BY_PRIORITY_SEQUENCE; +enum __MF_SORT_BY_PRIORITY_SEQUENCE { + MF_SORT_BY_PRIORITY_TYPE_A2Z, + MF_SORT_BY_PRIORITY_TYPE_Z2A, + MF_SORT_BY_PRIORITY_DATE_O2R, + MF_SORT_BY_PRIORITY_DATE_R2O, + MF_SORT_BY_PRIORITY_SIZE_S2L, + MF_SORT_BY_PRIORITY_SIZE_L2S, +}; + +/* File operation error check options definition */ +#define MF_ERROR_CHECK_SRC_ARG_VALID 0x0001 +#define MF_ERROR_CHECK_DST_ARG_VALID 0x0002 +#define MF_ERROR_CHECK_SRC_EXIST 0x0004 +#define MF_ERROR_CHECK_DST_EXIST 0x0008 +#define MF_ERROR_CHECK_SRC_PATH_VALID 0x0010 +#define MF_ERROR_CHECK_DST_PATH_VALID 0x0020 +#define MF_ERROR_CHECK_SRC_PARENT_DIR_EXIST 0x0040 +#define MF_ERROR_CHECK_DST_PARENT_DIR_EXIST 0x0080 +#define MF_ERROR_CHECK_DUPLICATED 0x0100 + +/* File system error definition */ +#define MF_ERROR_MASKL16 0xFFFF + +#define MF_ERROR_SET(X) (X & MF_ERROR_MASKL16) + +#define MID_CONTENTS_MGR_ERROR 0 + +#define MYFILE_ERR_NONE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x00)) /**< No error */ + +/*1-10*/ +#define MYFILE_ERR_SRC_ARG_INVALID (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x01)) /**< invalid src argument */ +#define MYFILE_ERR_DST_ARG_INVALID (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x02)) /**< invalid dst argument */ +#define MYFILE_ERR_FILE_DELETE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x03)) /**< exception of delete file */ +#define MYFILE_ERR_FILE_MOVE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x04)) /**< exception of move file */ +#define MYFILE_ERR_FILE_COPY_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x05)) /**< exception of copy file */ +#define MYFILE_ERR_FILE_WRITE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x06)) /**< exception of read file */ +#define MYFILE_ERR_RENAME_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x07)) /**< exception of rename file */ +#define MYFILE_ERR_FILE_NOT_FOUND (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x08)) /**< exception of file doesn't exist*/ +#define MYFILE_ERR_DIR_OPEN_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x09)) /**< exception of dir open*/ +#define MYFILE_ERR_DIR_CREATE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0a)) /**< exception of create dir */ + +/*11-20*/ +#define MYFILE_ERR_DIR_DELETE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0b)) /**< exception of delete dir */ +#define MYFILE_ERR_FILE_OPEN_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0c)) /**< exception of rename dir */ +#define MYFILE_ERR_DIR_COPY_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0d)) /**< exception of copy dir */ +#define MYFILE_ERR_DIR_MOVE_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0e)) /**< exception of move dir */ +#define MYFILE_ERR_DIR_FULL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x0f)) /**< exception of dir full */ +#define MYFILE_ERR_DIR_TOO_DEEP (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x10)) /**< exception of too deep dir */ +#define MYFILE_ERR_DIR_NOT_FOUND (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x11)) /**< exception of dir doesn't exist*/ +#define MYFILE_ERR_INVALID_DIR_NAME (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x12)) /**< exception of invalid dir name */ +#define MYFILE_ERR_INVALID_DIR_PATH (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x13)) /**< exception of invalid dir path */ +#define MYFILE_ERR_INVALID_FILE_NAME (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x14)) /**< exception of invalid file name */ + +/*21-30*/ +#define MYFILE_ERR_INVALID_FILE_PATH (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x15)) /**< exception of invalid file path */ +#define MYFILE_ERR_GET_MEMORY_STATUS_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x16)) /**< exception of statfs */ +#define MYFILE_ERR_DUPLICATED_NAME (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x17)) /**< exception of duplicated dir name*/ +#define MYFILE_ERR_SYSTEM_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x18)) /**< exception of operating on system dir.*/ +#define MYFILE_ERR_DIR_RECUR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x19)) /**< exception of copy/move a dir to its child */ +#define MYFILE_ERR_ALLOCATE_MEMORY_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1a)) /**< exception of memory allocation */ +#define MYFILE_ERR_OUT_OF_RANGE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1b)) +#define MYFILE_ERR_INVALID_PATH (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1c)) /**< invalid path string */ +#define MYFILE_ERR_ROOT_PATH (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1d)) /**< root path */ +#define MYFILE_ERR_DCM_ENGINE_APPEND (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1e)) /**< fail to append dcm data */ + +/*31-40*/ +#define MYFILE_ERR_NOT_MMF_FILE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x1f)) /**< isn't mmf file */ +#define MYFILE_ERR_SMAF_PERMISSION_DENY (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x20)) /**< smaf lock prohibits copy/move from mmc to phone */ +#define MYFILE_ERR_DRM_PERMISSION_DENY (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x21)) /**< can't copy/move drm file because of permission */ +#define MYFILE_ERR_COPY_TO_SRC_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x22)) /**< can't copy dir to source place*/ +#define MYFILE_ERR_COPY_ROOT_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x23)) /**< can't copy root dir*/ +#define MYFILE_ERR_COPY_TO_SRC_FILE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x24)) /**< can't copy file to source place*/ +#define MYFILE_ERR_MOVE_TO_SRC_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x25)) /**< can't move dir to source place */ +#define MYFILE_ERR_MOVE_ROOT_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x26)) /**< can't move root dir */ +#define MYFILE_ERR_MOVE_TO_SRC_FILE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x27)) /**< can't move file to source place*/ +#define MYFILE_ERR_MOVE_FILE_USING (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x28)) /**< can't move the file is being used*/ + +/*41-50*/ +#define MYFILE_ERR_DELETE_ROOT_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x29)) /**< can't delete root dir */ +#define MYFILE_ERR_DELETE_SYSTEM_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2a)) /**< can't delete system dir */ +#define MYFILE_ERR_RENAME_ROOT_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2b)) /**< can't rename root dir */ +#define MYFILE_ERR_RENAME_SYSTEM_DIR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2c)) /**< can't rename system dir */ +#define MYFILE_ERR_EXCEED_MAX_LENGTH (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2d)) /**< length of file/dir path exceeds maximum length*/ +#define MYFILE_ERR_LOW_MEMORY (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2e)) /**< low memory*/ +#define MYFILE_ERR_UNKNOWN_ERROR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x2f)) /**< unknow error*/ +#define MYFILE_ERR_WRONG_FILE_TYPE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x30)) /**< wrong file type */ +#define MYFILE_ERR_FILE_IS_BEING_USED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x31)) /**< file is being used */ +#define MYFILE_ERR_SRC_NOT_EXIST (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x32)) /**< source not found */ + +/*51-60*/ +#define MYFILE_ERR_DST_NOT_EXIST (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x33)) /**< destination not found */ +#define MYFILE_ERR_CREATE_TEMP_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x34)) /**< create temp file failed */ +#define MYFILE_ERR_GET_LOGIC_PATH_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x35)) /**< get logical path failed */ +#define MYFILE_ERR_STORAGE_TYPE_ERROR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x36)) /**< storage type error */ +#define MYFILE_ERR_EXT_GET_ERROR (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x37)) /**< get ext type failed */ +#define MYFILE_ERR_GET_PARENT_PATH_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x38)) /**< get parent path failed */ +#define MYFILE_ERR_GET_STAT_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x39)) /**< get stat failed */ +#define MYFILE_ERR_GENERATE_NAME_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3a)) /**< generate name failed */ +#define MYFILE_ERR_GET_CATEGORY_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3b)) /**< get file category failed */ +#define MYFILE_ERR_GET_VCONF_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3c)) /**< get vconf value failed */ + +/*61-70*/ +#define MYFILE_ERR_SETTING_RESET_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3d)) /**< setting item reset failed */ +#define MYFILE_ERR_DIR_CLEAR_FAILED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3e)) /**< dir not clearly deleted */ +#define MYFILE_ERR_SETTING_DELETE_FAILED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x3f)) /**< delete setting item failed */ +#define MYFILE_ERR_GET_THUMBNAIL_FAILED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x40)) /**< get file thumbnail failed */ +#define MYFILE_ERR_CANCEL_PRESSED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x41)) /**< cancel pressed while copy/move */ +#define MYFILE_ERR_ACCESS_MODE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x42)) /**< access mode not satisfied */ +#define MYFILE_ERR_FILE_READ_FAIL (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x43)) /**< exception of read file */ +#define MYFILE_ERR_INVALID_ARG (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x44)) /**< argument of function is not valid */ +#define MYFILE_ERR_NO_FREE_SPACE (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x45)) /**< get free space failed */ +#define MYFILE_ERR_GET_NAVI_FAILED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x46)) /**< get navigation bar failed */ + +/*71-80*/ +#define MYFILE_ERR_STORAGE_INUSE_REMOVED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x47)) /**< get navigation bar failed */ +#define MYFILE_ERR_VCONF_GET_FAILED (MID_CONTENTS_MGR_ERROR - MF_ERROR_SET(0x48)) /**< get vconf value failed */ + +/* File system related callback definition */ +typedef int (*myfile_operation_cb) (const char *current_path, + const char *destination, int copied_size, FILE * fSource, FILE * fDestination, void *data); + +typedef struct _FS_NODE_INFO fsNodeInfo; + +struct _FS_NODE_INFO { + char *path; + char *name; + UDate date; + fsFileType type; + char *ext; + off_t size; +}; + + +int mf_fs_oper_error(const char *src, const char *dst, int check_option); +void mf_fs_oper_print_node(fsNodeInfo *pNode); +/********** File Attribute Related **********/ +int mf_file_attr_get_file_stat(const char *filename, fsNodeInfo **node); + +int mf_file_attr_get_file_category(const char *filepath, fsFileType *category); +fsFileType mf_file_attr_get_file_type_by_mime(const char *file_path); + +int mf_file_attr_is_dir(const char *filepath); +int mf_file_attr_get_store_type_by_full(const char *filepath, MF_STORAGE *store_type); +int mf_file_attr_get_file_ext(const char *filepath, char **file_ext); +int mf_file_attr_is_duplicated_name(const char *dir, const char *name); +int mf_file_attr_is_valid_name(const char *filename); +int mf_file_attr_is_right_dir_path(const char *dir_path); +int mf_file_attr_is_right_file_path(const char *file_path); +int mf_file_attr_get_parent_path(const char *path, char **parent_path); +int mf_file_attr_get_logical_path_by_full(const char *full_path, char **path); +void mf_file_attr_get_file_size_info(char **file_size, fsNodeInfo *pNode); + +/********** File Operation Related **********/ +int mf_fs_oper_read_dir(const char *path, Eina_List **dir_list, Eina_List **file_list); +void mf_fs_oper_sort_list(Eina_List **list, int sort_opt); +int mf_fs_oper_create_dir(const char *dir); +int mf_fs_oper_rename_file(const char *src, const char *dst); +int mf_file_attr_get_file_icon(const char *file_path, int *error_code, int view_type, const char **thumbnail, media_info_h *media_info); +const char *mf_file_attr_get_default_icon_by_type(fsFileType ftype); +const char *mf_file_attr_get_default_thumbnail_by_type(fsFileType ftype); +int mf_file_attr_get_path_level(const char *fullpath, int *level); +int mf_file_attr_is_system_dir(char *fullpath, bool *result); +int mf_file_attr_is_disk_link(const char *fullpath, bool *result); +fsFileType mf_file_attr_get_file_type(const char *mime); + +#endif diff --git a/src/include/mf-gadget.h b/src/include/mf-gadget.h new file mode 100644 index 0000000..e97e1f0 --- /dev/null +++ b/src/include/mf-gadget.h @@ -0,0 +1,33 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_GADGET_H +#define __DEF_MYFILE_GADGET_H +#include + +void create_ug_image(void *data, char *path); +void create_ug_java(void *data, char *path); +int create_ug_email(void *data, char *path); +int create_ug_message(void *data, char *path); +int create_ug_detail(void *data, char *path); +int create_ug_password(void *data); + +void ug_closed_cb(ui_gadget_h ug, void *priv); + +#endif diff --git a/src/include/mf-gengrid.h b/src/include/mf-gengrid.h new file mode 100644 index 0000000..d7b7d1e --- /dev/null +++ b/src/include/mf-gengrid.h @@ -0,0 +1,51 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __DEF_MYFILE_GENGRID_H +#define __DEF_MYFILE_GENGRID_H + +#include "mf-util.h" + +#define MF_LANDSCAPE_GENGRID_ITEM_WIDTH 118 +#define MF_LANDSCAPE_GENGRID_ITEM_HEIGTH 161 + +#define MF_ICON_SIZE (165*MF_SCALE_FACTORY) + + + + +#define MF_HD_GENGRID_ITEM_WIDTH 177*MF_SCALE_FACTORY //(int)((8*MF_SCALE_FACTORY)+(164*MF_SCALE_FACTORY)+(8*MF_SCALE_FACTORY)) + +#define MF_HD_GENGRID_ITEM_HEIGTH (177 + 64)*MF_SCALE_FACTORY//(int)((18*MF_SCALE_FACTORY)+(164*MF_SCALE_FACTORY)+(72*MF_SCALE_FACTORY)) + +void mf_gengrid_create_grid_items(void *data, Evas_Object *grid, Eina_List *file_list); + +Evas_Object *mf_gengrid_create_grid(Evas_Object *parent); +Evas_Object *mf_gengrid_create(Evas_Object *parent); + +void mf_gengrid_refresh(void *data); +void mf_gengrid_get_grid_selected_files(Evas_Object *gengrid, Eina_List **list); +void mf_gengrid_edit_select(void *data, int *count); +void mf_gengrid_select_all(void *data); +Evas_Object *mf_gengrid_create_list(void *data, Evas_Object *parent); +void mf_gengrid_item_select(void *data, Evas_Object *pGengrid, int *file_count, int *dir_count); +void mf_gengrid_create_list_default_style(Evas_Object *pGengrid, void *data, Eina_List *dir_list, + Eina_List *file_list); +void mf_gengrid_get_grid_selected_items(Evas_Object *gengrid, Eina_List **list); +#endif + diff --git a/src/include/mf-inotify-handle.h b/src/include/mf-inotify-handle.h new file mode 100644 index 0000000..315c41d --- /dev/null +++ b/src/include/mf-inotify-handle.h @@ -0,0 +1,45 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef _MF_INOTIFY_HANDLE_H_ +#define _MF_INOTIFY_HANDLE_H_ + +typedef enum _mf_inotify_event mf_inotify_event; +enum _mf_inotify_event { + MF_INOTI_NONE = 0, + MF_INOTI_CREATE, + MF_INOTI_DELETE, + MF_INOTI_MODIFY, + MF_INOTI_MOVE_OUT, + MF_INOTI_MOVE_IN, + MF_INOTI_DELETE_SELF, + MF_INOTI_MOVE_SELF, + MF_INOTI_MAX, +}; + +typedef void (*mf_inotify_cb) (mf_inotify_event event, char *name, void *data); + +int mf_inotify_handle_init_inotify(void); +int mf_inotify_handle_add_watch(const char *path, mf_inotify_cb callback, void *user_data); +int mf_inotify_handle_rm_watch(void); +void mf_inotify_handle_finalize_inotify(void); +void mf_inotify_handle_request_handled_send(); + +#endif diff --git a/src/include/mf-language-mgr.h b/src/include/mf-language-mgr.h new file mode 100644 index 0000000..9fea9da --- /dev/null +++ b/src/include/mf-language-mgr.h @@ -0,0 +1,60 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __MF_LANGUAGE_CHANGER_H +#define __MF_LANGUAGE_CHANGER_H + + +#include + +typedef enum +{ + OBJ_TYPE_ELM_OBJECT, //elm_object_text_set(obj, text) + OBJ_TYPE_EDJE_OBJECT, //edje_object_part_text_set(obj, part, text) + OBJ_TYPE_MAX, +}obj_type; + +typedef enum +{ + ITEM_TYPE_NULL = 0, + ITEM_TYPE_CTRL = 1, + ITEM_TYPE_TAB = 2, + ITEM_TYPE_CTXPOP = 3, + ITEM_TYPE_MAX = 4, +}item_type; + +int mf_language_mgr_create(); +int mf_language_mgr_destroy(); + +/*part and string_id must be static*/ +void mf_language_mgr_register_object(Evas_Object *obj, obj_type type, const char *part, const char *string_id); +void mf_language_mgr_register_object_item(Elm_Object_Item *object_item, const char *text_ID, item_type type); +void mf_language_mgr_unregister_object_item(Elm_Object_Item *object_item); +void mf_language_mgr_unregister_object_item_by_type(item_type type); + +void mf_language_mgr_object_item_text_ID_set(Elm_Object_Item *object_item, const char *text_ID); + + +void mf_language_mgr_register_genlist_item(Elm_Object_Item *item); +void mf_language_mgr_unregister_genlist_item(Elm_Object_Item *item); + +void mf_language_mgr_register_gengrid_item(Elm_Object_Item *item); +void mf_language_mgr_unregister_gengrid_item(Elm_Object_Item *item); + +void mf_language_mgr_update(); + +#endif diff --git a/src/include/mf-launch.h b/src/include/mf-launch.h new file mode 100644 index 0000000..1c81df5 --- /dev/null +++ b/src/include/mf-launch.h @@ -0,0 +1,44 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_LAUNCH_H_ +#define __DEF_MYFILE_LAUNCH_H_ + +#include + + +typedef enum _LOAD_UG_TYPE MF_LOAD_UG_TYPE; + +enum _LOAD_UG_TYPE { + MF_LOAD_UG_MESSAGE, + MF_LOAD_UG_EMAIL, + MF_LOAD_UG_BLUETOOTH, + MF_LOAD_UG_DETAIL, + MF_LOAD_UG_MAX +}; + +ui_gadget_h mf_launch_load_ug(void *data, char *path, MF_LOAD_UG_TYPE type, char *file_count); +ui_gadget_h mf_launch_load_ug_myfile(void *data); + +int mf_launch_service(void *data, char *path); +Eina_Bool mf_launch_myfile_ug_exist(void *data); +void mf_launch_sns_load(void *data, char *path, MF_LOAD_UG_TYPE type, char *file_count); + +#endif + diff --git a/src/include/mf-log.h b/src/include/mf-log.h new file mode 100644 index 0000000..052712b --- /dev/null +++ b/src/include/mf-log.h @@ -0,0 +1,36 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MF_LOG__ +#define __MF_LOG__ + +#define MF_LOG_RESULT_FILE "/opt/usr/apps/org.tizen.myfile/data/log" +#define MF_LOG_FORMAT "[%s] [%s] {%d} -- %s" + +int mf_log_init(); +void mf_log_finalize(); +int mf_log_record(char *filename, const char *function, int line, char *fmt, ...); + + +#ifdef MYFILE_CRITICAL_LOG +#define MF_LOG_RECORD(fmt, arg...) do { mf_log_record(__FILE__, __func__, __LINE__, fmt, ##arg); } while (0) +#else +#define MF_LOG_RECORD(fmt, arg...) do { (void)0; }while (0) +#endif + +#endif diff --git a/src/include/mf-main.h b/src/include/mf-main.h new file mode 100644 index 0000000..6e7b440 --- /dev/null +++ b/src/include/mf-main.h @@ -0,0 +1,419 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_H_ +#define __DEF_MYFILE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +/* for SG */ +#include +#include + +/* for dlog */ +#include "mf-dlog.h" +#include "mf-util.h" +#include "mf-search.h" +#include "mf-copy.h" + +#define CTRL_DISABLE_NONE 0x0000 +#define CTRL_DISABLE_MOVE 0x0001 +#define CTRL_DISABLE_COPY 0x0002 +#define CTRL_DISABLE_DELETE 0x0004 +#define CTRL_DISABLE_SEND 0x0008 +#define CTRL_DISABLE_LIST_BY 0x0010 +#define CTRL_DISABLE_CREATE 0x0020 +#define CTRL_DISABLE_EDIT 0x0040 +#define CTRL_DISABLE_COPY_MOVE 0x0080 +#define CTRL_DISABLE_SEARCH 0x0100 +#define CTRL_DISABLE_MOVE_HERE 0x0200 +#define CTRL_DISABLE_COPY_HERE 0x0400 +#define CTRL_DISABLE_CANCEL 0x0800 +#define CTRL_DISABLE_MORE 0x1000 + +#define CTRL_DISABLE_EDIT_ALL (CTRL_DISABLE_DELETE | CTRL_DISABLE_SEND | CTRL_DISABLE_MORE) +#define CTRL_DISABLE_DEFAULT_SEL (CTRL_DISABLE_COPY) +#define CTRL_DISABLE_NOCONTENT_VIEW (CTRL_DISABLE_EDIT | CTRL_DISABLE_SEND) +#define CTRL_DISABLE_USER_FOLDER_SEL (CTRL_DISABLE_DELETE | CTRL_DISABLE_MORE) +#define CTRL_DISABLE_DEFAULT_ALL (CTRL_DISABLE_SEND | CTRL_DISABLE_MORE | CTRL_DISABLE_EDIT | CTRL_DISABLE_SEARCH) +#define CTRL_DISABLE_OTG_ROOT ~CTRL_DISABLE_SEARCH +#define CTRL_DISABLE_SYSFOLDER_SELECT (CTRL_DISABLE_MOVE_HERE) +#define CTRL_DISABLE_OTG_OPT_ROOT (CTRL_DISABLE_MOVE_HERE | CTRL_DISABLE_COPY_HERE | CTRL_DISABLE_CREATE) + + +#define myfile_ret_if(expr) do { \ + if (expr) { \ + mf_debug("!!! CHECK ERROR !!! (%s) -> %s() return!!!", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) +#define myfile_retv_if(expr, val) do { \ + if (expr) { \ + mf_debug("!!! CHECK ERROR !!! (%s) -> %s() return !!!", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) +#define myfile_retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + mf_debug(fmt, ##arg); \ + mf_debug("!!! CHECK ERROR !!! (%s) -> %s() return !!!", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) +#define myfile_retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + mf_debug(fmt, ##arg); \ + mf_debug("!!! CHECK ERROR !!! (%s) -> %s() return !!!", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +/*********** Global Definitions ***********/ +typedef void (*mfCallBack) (void *, Evas_Object *, void *); + +typedef struct _oper_record oper_record; + +struct _oper_record { + GString *path; +}; + +typedef struct _myfileNaviBar myfileNaviBar; + +struct _myfileNaviBar { + char *pNaviTitle; + char *pNaviLabel; /*indicate which storage is pointed by this navibar*/ + oper_record pre_operation; + char *pCurrentPath; + MORE_TYPE pre_more; /*for tab function only*/ + bool naviFlagInUse; + bool naviFlagEditStart; +}; + +typedef struct _mfEditView mfEditView; +struct _mfEditView { + Evas_Object *pBox; + Evas_Object *pGenlist; + Evas_Object *pGengrid; + //Evas_Object *pSelectAllCheckBox; + //Evas_Object *pSelectAllLayout; + Evas_Object *pPathInfo; + Evas_Object *pInfoBox; + Eina_Bool bSelectAllChecked; + int iTotalCount; + int iCheckedCount; +}; +#ifdef MYFILE_SPLIT_VIEW +typedef struct __mfSplitData mfSplitData; +struct __mfSplitData { + Evas_Object *pMainLayout; + Evas_Object *pPanes; + + Evas_Object *pSplitLeftGenlist; + //Evas_Object *pSelectAllLayout; + //Evas_Object *pSelectAllCheckBox; + Elm_Object_Item *phone_item; + Elm_Object_Item *mmc_item; + Elm_Object_Item *otg_item; + bool bFlagSplitViewCreate; + bool bFlagPortraitViewCreate; +}; +#endif + +typedef struct _myfileMainWindow myfileMainWindow; +struct _myfileMainWindow { + /* root window size */ + int root_w; + int root_h; + int root_x; + int root_y; + + /* graphic data */ + Evas *evas; + Evas_Object *pWindow; + Evas_Object *pBackGround; + Evas_Object *pConformant; + Evas_Object *pMainLayout; + Evas_Object *pTabBar; + Eina_List *plistNaviBar; + + Evas_Object *pNormalPopup; + Evas_Object *pContextPopup; + Evas_Object *pEntry; + Evas_Object *pEditField; + Evas_Object *pBox; + Ecore_Event_Handler *event; + Ecore_Event_Handler *font_event; + Evas_Object *pLabel; + Evas_Object *pLabelLayout; + Evas_Object *pProgressPopup; + Evas_Object *pFinishPopup; + Evas_Object *pMmcRemovedPopup; + Evas_Object *pProgressLayout; + Evas_Object *pOperationNotify; + Evas_Object *pSearchEntry; + Evas_Object *pSearchLabel; + + + Evas_Object *pNaviBar; + Evas_Object *pNaviLayout; + Evas_Object *pNaviLeftBtn; + Evas_Object *pNaviCtrlBar; + Evas_Object *pNaviSearchBar; + Evas_Object *pNaviBox; + Evas_Object *pNaviGenlist; + Evas_Object *pNaviGengrid; + Evas_Object *pNaviPathInfo; + Evas_Object *pNaviInfoBox; + Evas_Object *pTrayBox; + + Ecore_Timer *pPopupTimer; + +#ifdef MYFILE_SPLIT_VIEW + + Evas_Object *pNaviSplitContent; +#endif + Elm_Object_Item *pNaviItem; + +#ifdef MYFILE_SPLIT_VIEW + mfSplitData sSplitData; +#endif + mfEditView pEditView; +}; + +typedef struct _myfileStatus myfileStatus; + +struct _myfileStatus { + + int more; /** current mode **/ + int preMore; /** the mode before operation **/ + int rotation_type; /** current rotation type **/ + int pre_rotate_type; + int folder_count; /** current new created folders count **/ + int theme_type; /** current theme type **/ + int iRadioValue; /** current the radio box selected item value **/ + int flagViewType; /** current view type, List view or Thumbnail view **/ + int iFolderSortType; /* for list by operation */ + int iStorageState; /** current storage state **/ + int iCtrlDisableItem; + int iNFCState; + int iSelectedSortType; + int iExtensionState; + int view_type; + int preViewType; + + Eina_Bool flagRootView; + Eina_Bool flagNoContent; + Eina_Bool flagFolderSelect; + Eina_Bool flagFileSelect; + Eina_Bool flagStorageRemoved; + Eina_Bool flagNaviPush; + Eina_Bool flagIcuInit; + Eina_Bool flagLCDLock; /*lcd lock status*/ + Eina_Bool flagCtxPopShow; + Eina_Bool flagSearchAll; + Eina_Bool flagTabbarShow; + Eina_Bool flagIME; + + Evas_Object *pRadioGroup; + GString *path; /* current path */ + char *upper_folder; + char *search_filter; + int navi_item_selected; + char *monitor_path; + Elm_Object_Item *pPreNaviItem; + /* icu related */ + UDateTimePatternGenerator *generator; + UDateFormat *formatter; + + mf_search_handle search_handler; + +#ifdef MYFILE_SPLIT_VIEW + bool flagNofiles; + bool flagUpperSet; + /* rotate related*/ + bool view_mode_start; + bool view_mode_end; + int rotation_angle; + Ecore_Timer *rotation_timer; +#endif + +#ifdef MYFILE_MOTION_FEATURE + void (*doubletab_event_handler)(Evas_Object *data); +#endif + Ecore_Idler *app_init_idler; + Ecore_Idler *popup_del_idler; + Ecore_Idler *navi_content_idler; + Evas_Object *old_content; + + bool b_run_background; /* 20121008 added for fix PLM P121001-0404 temporary */ + +}; + + +typedef struct _myfileFileOperation myfileFileOperation; +struct _myfileFileOperation { + /* to rename */ + GString *to_rename; + char *file_name_suffix; + + /*clicked item name */ + GString *clicked_item; + + /*mmc operation flag */ + gboolean bmmc_is_removing; + + /*image viewer SG */ + ui_gadget_h ugImageViewer; + + /* operation error number */ + int error_number; + int error_code; + + /* pipe for inotify */ + void *conn; + Ecore_Pipe *sync_pipe; + gboolean same_storage; + + /* refresh type */ + GString *source; + GString *destination; + gboolean refresh_type; + + Ecore_Pipe *inotify_pipe; + + /* progress bar data record */ + Evas_Object *progress_bar; + Evas_Object *persent_label; + Evas_Object *count_label; + unsigned int current_count; + unsigned long total_file_size; + unsigned long finished_size; + int progress_cancel; + + /**drm file path*/ + char *drm_file_path; + Eina_List *search_result_list; + Eina_List *default_dir_list; + Eina_List *user_dir_list; + Eina_List *folder_list; + Eina_List *file_list; + Eina_List *category_list; + + + mf_cancel *pCancel; + mf_fo_request *pRequest; + mf_fo_msg *pMessage; + GList *pSourceList; + + Elm_Object_Item *pGenlistItem; + int iTotalCount; + int iRequestType; + Ecore_Timer *search_IME_hide_timer; + Elm_Object_Item *rename_item; + +#ifdef MYFILE_USB_OTG + Eina_List *otg_dev_list; + Eina_List *otg_dev_removed_list; +#endif + /**job handler**/ + Eina_List *job_pop_list; /*to record the job handler for to_content_pop*/ + Ecore_Job *job_push; /*to record the job handler for push a new view*/ + bool iOperationSuccessFlag; /*used for confirm whether the operation fininsh successfully, not canceled and failed*/ + char *pOperationMsg; + Elm_Object_Item *idle_delete_item; +}; + +typedef struct _myfileFileRecord myfileFileRecord; + +struct _myfileFileRecord { + /* operation property */ + Eina_List *operation_property; + + /* value saver for bluetooth / protection */ + Eina_List *value_saver; + Eina_List *selected_files; + Eina_List *selected_dest_files; + Eina_List *backup_file_list; +}; + +typedef struct _myfileSharedGadget myfileSharedGadget; +struct _myfileSharedGadget { + int is_password_correct; + ui_gadget_h ug; + /*SGController *sg_controller;for privacy lock*/ +}; + +struct _myfileOtg { + Evas_Object *rootpath_box; + Evas_Object *rootpath_layout; + Elm_Object_Item *rootpath_navi_item; +}; +typedef struct _myfileOtg myfileOtg; + +struct _myfileBundle { + service_h recv_service; + char *path; + char *select_type; + char *file_type; + char *marked_mode; + char *drm_type; +}; + +typedef struct _myfileBundle myfileBundle; + +struct appdata { + myfileMainWindow mf_MainWindow; + myfileStatus mf_Status; + myfileFileOperation mf_FileOperation; + myfileFileRecord mf_FileRecordList; + myfileSharedGadget mf_SharedGadget; + myfileOtg mf_Otg; + myfileBundle mf_Bundle; +}; + + +/*handler list node struct*/ +typedef struct _myfileEcoreHandleNode myfileEcoreHandleNode; +struct _myfileEcoreHandleNode { + Ecore_Job *handler; + char *navi_label; +}; + + +typedef enum _MF_ACTION mfAction; + +enum _MF_ACTION { + MFACTION_CLICK, + MFACTION_FLICK +}; + +#define _EDJ(o) elm_layout_edje_get(o) +Evas_Object *mf_main_load_edj(Evas_Object * parent, const char *file, const char *group); +#define GET_SYS_STR(str) dgettext("sys_string", str) +#define GET_STR(str) _(str) + +#endif /* __DEF_MYFILE_H_ */ diff --git a/src/include/mf-media-content.h b/src/include/mf-media-content.h new file mode 100644 index 0000000..6a033eb --- /dev/null +++ b/src/include/mf-media-content.h @@ -0,0 +1,40 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_MEDIA_CONTENT_H_DEF__ +#define __MF_MEDIA_CONTENT_H_DEF__ + +typedef struct __mf_condition_s mf_condition_s; +struct __mf_condition_s { + char *cond; /*set media type or favorite type, or other query statement*/ + media_content_collation_e collate_type; /*collate type*/ + media_content_order_e sort_type; /*sort type*/ + char *sort_keyword; /*sort keyword*/ + int offset; /*offset*/ + int count; /*count*/ + bool with_meta; /*whether get image or video info*/ +}; + +void mf_media_content_scan_file(const char *path); +void mf_media_content_scan_folder(const char *path); +int mf_media_content_data_get(void *data, char *condition, bool (*func) (media_info_h media, void *data)); + + +#endif + diff --git a/src/include/mf-move-internal.h b/src/include/mf-move-internal.h new file mode 100644 index 0000000..61b59f1 --- /dev/null +++ b/src/include/mf-move-internal.h @@ -0,0 +1,39 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_MOVE_INTERNAL_H_DEF__ +#define __MF_MOVE_INTERNAL_H_DEF__ + +#include +#include +#include +#include "mf-cancel.h" +#include "mf-request.h" +#include "mf-fo-common.h" +#include "mf-fo-internal.h" + +int _mf_move_move_regfile(const char *src, struct stat *src_statp, + const char *dst, unsigned long buf_size, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + +int _mf_move_move_directory(const char *src, struct stat *src_statp, const char *dst, mf_cancel *cancel, _mf_fo_msg_cb msg_cb, void *msg_data); + +int _mf_move_move_internal(const char *src, const char *dst_dir, + mf_cancel *cancel, mf_req_callback request_callback, _mf_fo_msg_cb msg_callback, void *msg_data); + +#endif diff --git a/src/include/mf-move.h b/src/include/mf-move.h new file mode 100644 index 0000000..56db7b9 --- /dev/null +++ b/src/include/mf-move.h @@ -0,0 +1,51 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_MOVE_H_DEF__ +#define __MF_MOVE_H_DEF__ + +#include +#include "mf-cancel.h" +#include "mf-request.h" +#include "mf-fo-common.h" + +/** + * mf_move_move_items: + * @item_list: a GList of strings containing item path to move + * @dst_dir: destination directory to move + * @request_callback: callback to handle duplicated file/directory name, + * if NULL is set for requset_callback, default action is merge. + * for detail, see "mf_request.h" + * @msg_callback: callback for reporting progress, for detail, see "mf_fo_common.h" + * @cancel : a handle for cancelling move operation, for detail, see "mf_cancel.h" + * @sync: a variable for requesting file system sync, if TRUE is set, sync() function is called after move done. + * @u_data: user data + * + * Start move items in given @item_list to @dst_dir, @msg_callback will be called repeatly with @u_data + * in certain interval to report current progress. + * if duplicated file/directory is found, @request_callback is called with @u_data, + * and move operation will be blocked until user's decision is decided. + * if someone want to cancel operation, call mf_cancel_do_cancel() with @cancel. + * if @sync is set TRUE, sync() function is called after move operation is done to flush out file system cache. + * Return value: This function returns zero on success, or negative value. + **/ + +int mf_move_move_items(GList *item_list, const char *dst_dir, mf_cancel *cancel, gboolean sync, void *u_data); + +#endif diff --git a/src/include/mf-otg.h b/src/include/mf-otg.h new file mode 100644 index 0000000..8ddee95 --- /dev/null +++ b/src/include/mf-otg.h @@ -0,0 +1,186 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __DEF_MF_OTG_H__ +#define __DEF_MF_OTG_H__ + +#include "mf-main.h" +#include "mf-fs-util.h" +#include "mf-resource.h" + +enum _mf_otg_list { + MF_OTG_LIST_NONE = 0, + MF_OTG_LIST_DEV, + MF_OTG_LIST_REMOVED, + MF_OTG_LIST_MAX +}; +typedef enum _mf_otg_list mf_otg_list_e; + +enum _mf_otg_status { + MF_OTG_STATUS_NONE = 0x00, + MF_OTG_STATUS_EDIT = 0x01, + MF_OTG_STATUS_USING = 0x02 +}; +typedef enum _mf_otg_list mf_otg_status_e; + +enum _mf_otg_ex_opt { + MF_OTG_OPT_NONE = 0x00, + MF_OTG_OPT_REQ_POPUP_DEL = 0x01, + MF_OTG_OPT_NOR_POPUP_DEL = 0x02, + MF_OTG_OPT_TABBAR_ENABLE = 0x04, + MF_OTG_OPT_THEME_RESET = 0x08 + +}; +typedef enum _mf_otg_ex_opt mf_otg_ex_opt_e; + +struct _mf_otg_node { + char *name; /*disk name*/ + bool flag_using; /*if the disk is using*/ + bool flag_editstart; /*if the edit mode changed from this disk*/ +}; +typedef struct _mf_otg_node mf_otg_node; + +/** + * mf_otg_list_clean + *@data, the appdata which contain the otg lists : device list, removed list + *@list_type, a variable for indicate list type: device list, removed list + *clean the otg list whicn list_type indicate + */ +void mf_otg_list_clean(void *data, mf_otg_list_e list_type); + +/** + * mf_otg_init + *@data, the appdata which contain the otg list + *read the otg folder, save the device into the otg list + */ +int mf_otg_init(void *data); +/** + * mf_otg_is_in_list + *@data, the appdata which contain the otg list + *@dev name: the device name + *check if the device in the otg list + */ + +bool mf_otg_is_in_list(void *data, const char *dev_name); + +/** + * mf_otg_insert_node + *@data, the appdata which contain the otg list + *@name: the new insert device name + *insert the new insert device into the otg list + */ + +int mf_otg_insert_node(void *data, const char *name); + +/** + * mf_otg_delete_node + *@data, the appdata which contain the otg list + *@name: the remove device name + *delete the removed device node from the otg list + */ +int mf_otg_delete_node(void *data, const char *name); + +/** + * mf_otg_list_update + *@data, the appdata which contain the otg list + *@flag_inc_dec: true: increase devices. false: remove devices + *update the otg list + */ +int mf_otg_list_update(void *data, bool flag_inc_dec); + +/** + * mf_otg_is_empty + *@data, the appdata which contain the otg list + *check if the otg list is empty + * + */ +bool mf_otg_is_empty(void *data); + +/** + * mf_otg_get_node_in_use + *@data, the appdata which contain the otg list + *get the otg device name which is in used currently + * + */ +char *mf_otg_get_node_in_use(void *data); + +/** + * mf_otg_set_node_using_flag + *@data, the appdata which contain the otg list + *@dev_name, the dest device name + *@status, ture: in used; false: not in used + *set the dest device in used flag + * + */ +void mf_otg_set_node_using_flag(void *data, char *dev_name, bool status); + +/** + * mf_otg_clear_removed_device + *@data, the appdata which contain the otg list + *clear the removed otg list + * + */ +void mf_otg_clear_removed_device(void *data); + +/** + * mf_otg_generate_removed_list + *@data, the appdata which contain the otg list + * get the devices which are not in the otg list now to generate the removed list + * + */ +void mf_otg_generate_removed_list(void *data); + +/** + * mf_otg_dev_removed_update + *@data, the appdata which contain the otg list + *@opt, the option which need to check when update the view + * MF_OTG_OPT_REQ_POPUP_DEL: delete the request popup + * MF_OTG_OPT_NOR_POPUP_DEL: delete the normal popup + * MF_OTG_OPT_TABBAR_ENABLE: set the tar bar enable + * MF_OTG_OPT_THEME_RESET: reset the mainlayout theme + * + * the refresh operation when remove some devices but not remove all devices + * + */ +void mf_otg_dev_removed_update(void *data, mf_otg_ex_opt_e opt); + +/** + * mf_otg_dev_all_removed_update + *@data, the appdata which contain the otg list + *@opt, the option which need to check when update the view + * MF_OTG_OPT_REQ_POPUP_DEL: delete the request popup + * MF_OTG_OPT_NOR_POPUP_DEL: delete the normal popup + * MF_OTG_OPT_TABBAR_ENABLE: set the tar bar enable + * MF_OTG_OPT_THEME_RESET: reset the mainlayout theme + * + * the refresh operation when remove all devices + * + */ +void mf_otg_dev_all_removed_update(void *data, mf_otg_ex_opt_e opt); + +/** + * mf_otg_finalize + *@data, the appdata which contain the otg list + * + * clear the otg list + * + */ +void mf_otg_finalize(void *data); +void mf_otg_set_node_editstart_flag(void *data, char *dev_name, bool status); + +#endif diff --git a/src/include/mf-request.h b/src/include/mf-request.h new file mode 100644 index 0000000..8a6c25c --- /dev/null +++ b/src/include/mf-request.h @@ -0,0 +1,139 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_REQUEST_H_DEF__ +#define __MF_REQUEST_H_DEF__ + +#include + +/** + * mf_request_type: + * @MF_REQ_NONE: initial state of #mf_fo_request, if set this one by mf_request_set_result(), + * undefined action may occurs. + * @MF_REQ_MERGE: indicates merge type operation + * @MF_REQ_RENAME: indicates rename type operation. + * to specify new name, use mf_request_set_result_rename() + * @MF_REQ_SKIP : indicates skip this item + * @MF_REQ_CANCEL : indicates cancel whole operation + * + * If the #mf_req_callback is called by operator, conductor should decide request type by + * mf_request_set_result() or mf_request_set_result_rename(). + * + * Note that the #mf_request_type enumeration may be extended at a later + * + */ + +typedef enum _request_type mf_request_type; + +enum _request_type { + MF_REQ_NONE, + MF_REQ_MERGE, + MF_REQ_RENAME, + MF_REQ_SKIP, + MF_REQ_CANCEL, +}; + +/** + * mf_fo_request: + * mf_fo_request is an opaque structure whose members + * cannot be accessed directly. + */ +typedef struct _mf_fo_req mf_fo_request; + +/** + * mf_req_callback: + * @req: the handle of request, use mf_request_set_result() or mf_request_set_result_rename() + * to set detail decision with this handle. + * @data: user data. + **/ +typedef void (*mf_req_callback) (mf_fo_request *req, void *data); + +/** + * mf_request_new: + * Creates a new #mf_fo_request. + * Return value: This function returns a new #mf_fo_request on success, or %NULL. + **/ +mf_fo_request *mf_request_new(void); + +/** + * mf_request_free: + * @req : a #mf_fo_request + * Release all allocated memory for @req. + **/ +void mf_request_free(mf_fo_request *req); + +/** + * mf_request_set_result: + * @req : a #mf_fo_request + * @result : a user's decision type #mf_request_type value + * Set @result to @req + **/ +void mf_request_set_result(mf_fo_request *req, mf_request_type result); + +/** + * mf_request_set_result_rename: + * @req : a #mf_fo_request + * @new_name : a user specified new name, string for item name + * Set @new_name to @req, and #mf_request_type is selected #MF_REQ_RENAME + **/ +void mf_request_set_result_rename(mf_fo_request *req, const char *new_name); + +/** + * mf_request_set_cond: + * @req : a #mf_fo_request + * @cond : a #GCond for @req + * Set @cond to @req + **/ +void mf_request_set_cond(mf_fo_request *req, GCond *cond); + +/** + * mf_request_set_path: + * @req : a #mf_fo_request + * @path : a string for duplicated item name. + * Set @path to @req + **/ +void mf_request_set_path(mf_fo_request *req, const char *path); + + +/** + * mf_request_get_result: + * @req : a #mf_fo_request + * Return value: user selected #mf_request_type. + **/ +mf_request_type mf_request_get_result(mf_fo_request *req); + +/** + * mf_request_get_path: + * @req : a #mf_fo_request + * Return value: a string for duplicated item name. + **/ +const char *mf_request_get_path(mf_fo_request *req); + +/** + * mf_request_get_path: + * @req : a #mf_fo_request + * To get item's new name , if user specify new name for duplicated item by mf_request_set_result_rename. + * Return value: a user specified new name, string for item name, or NULL + **/ +char *mf_request_get_new_name(mf_fo_request *req); +int mf_request_flag_get(mf_fo_request *req); +void mf_request_flag_set(mf_fo_request *req, int value); +void mf_msg_request_handled_send(); + +#endif diff --git a/src/include/mf-resource.h b/src/include/mf-resource.h new file mode 100644 index 0000000..8e8444e --- /dev/null +++ b/src/include/mf-resource.h @@ -0,0 +1,171 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __DEF_MYFILE_RESOURCE_H_ +#define __DEF_MYFILE_RESOURCE_H_ + + + +/********************* System strings ***************/ +#define MF_POP_MSG_NFC "IDS_COM_BODY_NFC" +#define MF_POP_MSG_CLOSE "IDS_COM_POP_CLOSE" +#define MF_LABEL_SEARCH "IDS_COM_BODY_SEARCH" +#define MF_LABEL_CREATE_FOLDER "IDS_COM_BODY_CREATE_FOLDER" +#define MF_LABEL_FOLDER "IDS_COM_POP_FOLDER" +#define MF_LABEL_DONE "IDS_COM_SK_DONE" +#define MF_LABEL_LIST "IDS_COM_OPT_LIST" +#define MF_LABEL_MORE "IDS_COM_BODY_MORE" +#define MF_LABEL_SELECTED "IDS_COM_BODY_SELECTED" +#define MF_LABEL_NAME_HA_TO_Z "IDS_MF_OPT_NAME_HA_TO_Z" +#define MF_LABEL_NAME_HZ_TO_A "IDS_MF_OPT_NAME_HZ_TO_A" +#define MF_LABEL_DATE_HMOST_RECENT "IDS_MF_OPT_DATE_HMOST_RECENT" +#define MF_LABEL_DATE_HOLDEST "IDS_MF_OPT_DATE_HOLDEST" +#define MF_LABEL_SIZE "IDS_COM_BODY_SIZE" +#define MF_LABEL_TYPE "IDS_COM_POP_TYPE" +#define MF_LABEL_NO_FILES "IDS_COM_BODY_NO_FILES" +#define MF_LABEL_SELECT_ALL "IDS_COM_BODY_SELECT_ALL" +#define MF_LABEL_PHONE "IDS_COM_BODY_PHONE" +#define MF_LABEL_MMC "IDS_COM_BODY_MEMORY_CARD" +#define MF_POP_MSG_BT "IDS_COM_BODY_BLUETOOTH" +#define MF_POP_MSG_EMAIL "IDS_COM_BODY_EMAIL" +#define MF_POP_MSG_MESSAGE "IDS_COM_BODY_MESSAGE" +#define LABEL_MYFILE "IDS_COM_BODY_MY_FILES" +#define LABEL_SAVE "IDS_COM_SK_SAVE" +#define LABEL_CANCEL "IDS_COM_SK_CANCEL" +#define LABEL_RENAME "IDS_COM_SK_RENAME" +#define LABEL_DETAIL "IDS_COM_BODY_DETAILS" +#define LABEL_DELETE "IDS_COM_BODY_DELETE" +#define LABEL_SEARCH "IDS_COM_SK_SEARCH" +#define LABEL_SHARE "IDS_COM_SK4_SHARE" +#define LABEL_COPY "IDS_COM_BODY_COPY" +#define LABEL_MOVE "IDS_COM_BODY_MOVE" +#define MF_BUTTON_LABEL_YES "IDS_COM_SK_YES" +#define MF_BUTTON_LABEL_NO "IDS_COM_SK_NO" +#define MF_BUTTON_LABEL_OK "IDS_COM_SK_OK" +#define MF_BUTTON_LABEL_DEL "IDS_COM_POP_DELETE_Q" +#define MF_MSG_COPYING "IDS_COM_POP_COPYING_ING" +#define MF_MSG_DELETING "IDS_COM_POP_DELETING" +#define MF_MSG_MOVING "IDS_COM_POP_MOVING" +#define MF_MSG_COPY_SCCESS "IDS_COM_POP_COPIED_P" +#define MF_MSG_MOVE_SUCCESS "IDS_COM_POP_MOVED" +#define MF_MSG_DELETE_SUCCESS "IDS_COM_POP_DELETED" +#define MF_MSG_MOVE_FAILED "IDS_COM_POP_MOVING_FAILED" +#define MF_POP_MSG_WIFI "IDS_COM_OPT1_WI_FI_DIRECT" +#define LABEL_NO_RESULT "IDS_COM_BODY_NO_SEARCH_RESULTS" +#define MF_LABEL_INVALID_CHARACTERS "IDS_COM_POP_INVALID_CHARACTERS" +#define MF_LABEL_RETRY "IDS_COM_SK_RETRY" +#define MF_LABEL_REPLACE "IDS_COM_BODY_REPLACE_ABB" +#define MF_LABEL_LIST_BY "IDS_COM_BODY_LIST_BY" +#define MF_LABEL_EDIT "IDS_COM_BODY_EDIT" +#define MF_LABEL_UNSUPPORT_FILE_TYPE "IDS_COM_POP_UNSUPPORTED_FILE_TYPE" +#define MF_LABEL_HOME "IDS_COM_BODY_HOME" +#define MF_LABEL_SUCCESS "IDS_COM_POP_SUCCESS" +#define MF_LABEL_FAILED "IDS_COM_POP_FAILED" +#define MF_LABEL_DELETE_FAILED "IDS_COM_POP_DELETE_FAILED" +#define MF_LABEL_FILE_NOT_EXIST "IDS_COM_POP_FILE_NOT_EXIST" +#define MF_LABEL_NOTHING_SELECTED "IDS_COM_POP_NOTHING_SELECTED" +#define MF_LABEL_NO_APP "IDS_COM_BODY_NO_APPLICATIONS_CAN_PERFORM_THIS_ACTION" +#define MF_LABEL_MAX_CHARACTER_REACHED "IDS_COM_POP_MAXIMUM_NUMBER_OF_CHARACTERS_REACHED" +#define MF_LABEL_FACEBOOK "IDS_COM_BODY_FACEBOOK" +#define GL_SHARE_TWITTER "IDS_COM_BODY_TWITTER" +#define GL_SHARE_YOUTUBE "IDS_COM_BODY_YOU_TUBE" +#ifdef _USE_ENABLE_FLICKR +#define GL_SHARE_FLICKR "IDS_COM_BODY_FLICKR" +#endif +#define GL_SHARE_PICASA "IDS_COM_BODY_PICASA" +#define MF_LABEL_BACK "IDS_COM_SK_BACK" +#define MF_LABEL_ADDED "IDS_COM_OPT_ADDED" +#define MF_LABEL_SEARCHING "IDS_COM_POP_SEARCHING" +/****************** Local strings ****************/ + +/**********No string ID ************/ +#define MF_POPUP_MESSAGE_SEND_FAIL3 "Folder can't be sent" +#define MF_POPUP_MSG_NAME_INVALID "Invalid name, retry?" +#define MF_MSG_ILLEGAL_CHAR "Invalid character entered. Try again?" +#define MF_MSG_NAME_REACH_MAX_LEN "Length should be less than 255" +#define MF_MSG_PATH_REACH_MAX_LEN "Full path length should be less than 4096,Retry?" +#define MF_MSG_DUP_NAME "Duplicated name, retry?" +#define MF_RENAME_MSG_DUP_NAME "Duplicated name" +#define MF_MSG_OPER_READ_ONLY "Operation failed: Read Only Area" +#define MF_MSG_CREATE_DIR_FAILED "Create Directory failed" +#define MF_MSG_EMPTY_FOLDER_NAME "Folder name can't be empty!Retry?" +#define MF_MSG_GET_NAME_FAILED "Get name failed. try again!" +#define MF_RENAME_MSG_GET_NAME_FAILED "Get name failed" +#define MF_MSG_SET_NAME_DOT "Can't set file name as \".\" and \"..\" , Retry?" +#define MF_MSG_SET_NAME_ALL_SPACE "Can't set file name as all spaces,Retry?" +#define MF_MSG_GENERATE_NEW_NAME_FAILED "Generate new name failed, Retry?" +#define MF_MSG_UNKNOW_REASON_RENAME_FAILED "Rename failed with unknown reason, retry?" +#define MF_MSG_NO_NAME_WARNING "Name is empty. Please enter name" +#define MF_MSG_MOVE_FAILED2 "Cannot move: The destination folder is the same as the source folder" +#define MF_MSG_COPY_FAILED1 "Cannot copy: The destination folder is subfolder of source folder" +#define MF_MSG_IO_ERR "Critical file IO error" +#define MF_MSG_UNKNOWN_ERR "Unknow file IO error" +#define MF_MSG_BIG_SIZE_ERR "File size is too big" +#define MF_MSG_LONG_NAME_ERR "File name is too long" +#define MF_MSG_ARG_ERR "Argument error" +#define MF_MSG_DEFAULT_ERR "Internal error" +#define MF_MSG_FAULT_ERR "Invalid argument pointer" +#define MF_MSG_FILE_TYPE_ERR "File type error" +#define MF_MSG_MEM_ERR "Memory malloc error" +#define MF_MSG_LOOP_ERR "Folder structure is too deep" /* Too many symbolic links were encountered in resolving pathname , the max is 16*/ +#define MF_MSG_RO_ERR "Read-only file system" +#define MF_MSG_MAX_OPEN_ERR "Reach the maximum number of openning files"/*The process already has the maximum number of files open.*/ +#define MF_BUTTON_LABEL_RENAME_AUTOMATICALLY "Rename automatically" +#define MF_LABEL_A_TO_Z "A to Z" +#define MF_LABEL_Z_TO_A "Z to A" +#define MF_LABEL_MOST_RECENT "Most recent" +#define MF_LABEL_OLDEST "Oldest" +#define MF_LABE_NOT_SUPPORT "Not support now" +/******************** local string ID ************/ + +#define MF_POPUP_MESSAGE_SEND_FAIL1 "IDS_MF_POP_SEND_FAILED" +#define MF_POPUP_MESSAGE_SEND_FAIL2 "IDS_MF_POP_DRM_FILE_CANNOT_SEND" +#define MF_MSG_FOLDER_NUM_MAX "IDS_MF_POP_MAXIMUM_FOLDER_REACHED" +#define MF_MSG_FOLDER_DIR_IN_USE "IDS_MF_POP_SAME_NAME_ALREADY_IN_USE" +#define MF_MSG_MEMORY_NOT_ENOUGH "IDS_MF_POP_NOT_ENOUGH_HEAP_MEMORY" + +#define MF_MSG_MOVE_FAILED1 "IDS_MF_POP_UNABLE_TO_MOVE_DESTINATION_FOLDER_SAME_AS_SOURCE_FOLDER" +#define MF_MSG_NOT_ENOUGH_SPACE "IDS_MF_POP_NOT_ENOUGH_MEMORY_DELETE_SOME_ITEMS" +#define MF_MSG_COPY_FAILED2 "IDS_MF_POP_COPYING_FAILED" +#define MF_MSG_MOVE_FAILED3 "IDS_MF_POP_MOVING_FAILED" +#define MF_MSG_DEL_FAILED1 "IDS_MF_POP_DELETE_FAILED" +#define MF_MSG_NO_SPACE "IDS_MF_BODY_NOT_ENOUGH_MEMORY_IN_PHONE_MEMORY_DELETE_SOME_ITEMS_AND_TRY_AGAIN" +#define MF_MSG_PERMISSION_ERR "IDS_MF_POP_PERMISSION_DENIED" +#define MF_MSG_COPY_FAILED "IDS_MF_POP_COPYING_FAILED" +#define MF_MSG_RENAME_ILLEGAL_CHAR "IDS_MF_POP_INVALID_FILE_NAME" + + +#define LABEL_COPY_HERE "IDS_MF_POP_PASTE_HERE" +#define LABEL_MOVE_HERE "IDS_MF_OPT_MOVE_HERE" +#define LABEL_LIST_VIEW "IDS_MF_OPT_VIEW_BY_LIST" +#define MF_LABEL_UPPER "IDS_MF_TAB_UP" +#define MF_LABEL_ASCENDING "IDS_MF_POP_ASCENDING" +#define MF_LABEL_DESCENDING "IDS_MF_POP_DESCENDING" + +#define LABEL_LIST_DETAIL_VIEW "IDS_MF_BODY_LIST_AND_DETAILS_ABB" +#define LABEL_VIEW_AS "IDS_MF_OPT_VIEW_AS" +#define MF_LABEL_SHOW_EXTENSION "IDS_MF_OPT_SHOW_FILE_EXTENSION" +#define MF_LABEL_OTG "IDS_MF_TAB_EXTERNAL_STORAGE" +#define MF_LABEL_THUMBNAILS "IDS_MF_OPT_THUMBNAIL_VIEW" +#define MF_LABEL_SEARCH_ALL "IDS_MF_BUTTON_SEARCH_ALL_FOLDERS" +#define LABEL_SORT_BY "IDS_MF_OPT_SORT_BY" +#define MF_LABEL_HIDE_EXTENSION "IDS_MF_OPT_HIDE_FILE_EXTENSION_ABB" +#define MF_LABEL_ADD_TO_HOME "IDS_MF_BUTTON_ADD_TO_HOME" + +#endif diff --git a/src/include/mf-s-beam.h b/src/include/mf-s-beam.h new file mode 100644 index 0000000..abb730f --- /dev/null +++ b/src/include/mf-s-beam.h @@ -0,0 +1,43 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MF_S_BEAM_H__ +#define __MF_S_BEAM_H__ + +#include "mf-main.h" + +typedef void (*Mf_Sbeam_Cb)(void *user_data); + +#ifdef __cplusplus +extern "C" { +#endif + +bool mf_sbeam_init(); +void mf_sbeam_finalize(); +bool mf_sbeam_enable(); +bool mf_sbeam_disable(); +bool mf_sbeam_set_callback(Mf_Sbeam_Cb callback, void *user_data); +bool mf_sbeam_share_files(Evas_Object *win, Eina_List *file_list); + +#ifdef __cplusplus +} +#endif + + +#endif /* __MF_S_BEAM_H__ */ + diff --git a/src/include/mf-search-internal.h b/src/include/mf-search-internal.h new file mode 100644 index 0000000..5431569 --- /dev/null +++ b/src/include/mf-search-internal.h @@ -0,0 +1,78 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef _MF_SEARCH_INTERNAL_H_ +#define _MF_SEARCH_INTERNAL_H_ + +#include "mf-search.h" + +#ifdef MS_USE_DEF_LOG + +#include "mf-dlog.h" + +#define ms_debug(fmt , args...) mf_debug +#define ms_info(fmt , args...) mf_info +#define ms_warn(fmt , args...) mf_warnig +#define ms_error(fmt , args...) mf_error +#define ms_assert(fmt , args...) mf_assert + +#else + + +#ifdef DEBUG_ON +#define ms_debug(fmt , args...) do { printf("[%10s:%4d][D] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define ms_info(fmt , args...) do { printf("[%10s:%4d][I] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define ms_warn(fmt , args...) do { printf("[%10s:%4d][W] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define ms_error(fmt , args...) do { printf("[%10s:%4d][E] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#define ms_assert(fmt , args...) do { printf("[%10s:%4d][A] "fmt"\n", __func__, __LINE__, ##args); } while (0) +#else +#define ms_debug(fmt , args...) do { (void)0; } while (0) +#define ms_info(fmt , args...) do { (void)0; } while (0) +#define ms_warn(fmt , args...) do { (void)0; } while (0) +#define ms_error(fmt , args...) do { (void)0; } while (0) +#define ms_assert(fmt , args...) do { (void)0; } while (0) +#endif +#endif + +/** + * Enumerations of search state + **/ + +int _mf_search_init(ms_handle_t **handle); +int _mf_search_start(ms_handle_t *handle, + const char **root_path, + unsigned int path_num, + const char *needle, + mf_search_option option, + void *user_data, + mf_search_filter_cb func, + int category); +int _mf_search_stop(ms_handle_t *handle); +void _mf_search_finalize(ms_handle_t **handle); + +/*+++++++++++++++++++++++++ UTIL APIs ++++++++++++++++++++++++++++++ */ + +gchar *_mf_search_result_dir_get(mf_search_result_t *result); +gchar *_mf_search_result_file_get(mf_search_result_t *result); +gboolean _mf_search_result_is_end(mf_search_result_t *result); +gchar *_mf_search_result_current_dir_get(mf_search_result_t *result); +guint _mf_search_result_total_count_get(mf_search_result_t *result); + +#endif diff --git a/src/include/mf-search.h b/src/include/mf-search.h new file mode 100644 index 0000000..076b151 --- /dev/null +++ b/src/include/mf-search.h @@ -0,0 +1,225 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef _MF_SEARCH_H_ +#define _MF_SEARCH_H_ + +/*+++++++++++++++++++++++ Definitions and Types +++++++++++++++++++++++*/ + +/** + * Handle type for mf_search + **/ +typedef unsigned int mf_search_handle; + +/** + * Handle type for search result + **/ +typedef unsigned int mf_search_result; + +typedef int (*mf_search_filter_cb) (const char *); + + +/** + * Enumerations of search option + **/ + +typedef enum _mf_search_option mf_search_option; + +enum _mf_search_option { + MF_SEARCH_OPT_NONE = (1 << 0), + MF_SEARCH_OPT_HIDDEN = (1 << 1), + MF_SEARCH_OPT_DIR = (1 << 2), + MF_SEARCH_OPT_FILE = (1 << 3), +}; + +typedef enum _mf_search_pipe_msg_type mf_search_pipe_msg_type; +enum _mf_search_pipe_msg_type { + MF_SEARCH_PIPE_MSG_NONE = 0, + MF_SEARCH_PIPE_MSG_ROOT_CHANGE, + MF_SEARCH_PIPE_MSG_RESULT_REPORT, + MF_SEARCH_PIPE_MSG_FINISHED, + MF_SEARCH_PIPE_MSG_MAX, +}; + +typedef enum _mf_search_state mf_search_state; +enum _mf_search_state { + MF_SEARCH_STATE_NONE = 0, + MF_SEARCH_STATE_INIT, + MF_SEARCH_STATE_SEARCH, + MF_SEARCH_STATE_MAX, +}; + +typedef struct _mf_search_result_t mf_search_result_t; +struct _mf_search_result_t { + GList *dir_list; + GList *file_list; + gchar *current_dir; + guint total_count; + gboolean is_end; +}; + +typedef struct _ms_args_t ms_args_t; +struct _ms_args_t { + GList *root_path; + gchar *needle; + mf_search_option option; + void *user_data; + mf_search_filter_cb func; + int category; +} ; + +typedef struct _ms_handle_t ms_handle_t; +struct _ms_handle_t { + mf_search_state state; + GMutex *cmd_lock; + ms_args_t *args; + + GThread *thread_h; + GMutex *thread_mutex; + /* critical section */ + gboolean is_stop; + mf_search_result_t *result; + /* critical section */ +}; + +typedef struct _mf_search_pipe_msg mf_search_pipe_msg; +struct _mf_search_pipe_msg { + mf_search_pipe_msg_type mf_sp_msg_type; + void *report_result; + gchar *current_path; +}; + +/** + * mf_Search_Cb: + * @result: the handle of result, use util APIs to get detail result with this handle. + * @user_data: user data specified when installing the function, in mf_search_start() + **/ +typedef void (*mf_Search_Cb) (mf_search_pipe_msg_type type, mf_search_result result, void *user_data); + +/** + * Definition of error code + **/ +#define MF_SEARCH_ERROR_NONE (0) +#define MF_SEARCH_ERROR_INTERNAL (-(1)) /* Internal error */ +#define MF_SEARCH_ERROR_INVAL_P (-(2)) /* Invalid params */ +#define MF_SEARCH_ERROR_INVAL_S (-(3)) /* Invalid status */ +#define MF_SEARCH_ERROR_ALLOC (-(4)) /* Memory allocation failed */ +#define MF_SEARCH_ERROR_FS (-(5)) /* File system error */ + +/*+++++++++++++++++++++++ APIs +++++++++++++++++++++++*/ + +/** + * mf_search_init: + * @handle: the handle of mf_search + * Creates a new @handle for search. If success, + * #mf_search state is changed from MF_SEARCH_STATE_NONE to MF_SEARCH_STATE_INIT + * Return value: This function returns zero on success, or negative value. + **/ +int mf_search_init(mf_search_handle *handle); + +/** + * mf_search_start: + * @handle: the handle of mf_search + * @root_path: array of the root path for search + * @path_num: the number of the root path for search + * @needle: the key string for search + * @option : bitfield of mf_search_option flags + * @user_data: user data + * Start searching in given @root_path with @needle, + * every each idle time, @callback will be called with #mf_search_result_t and @user_data. + * If success, #mf_search state is changed from MF_SEARCH_STATE_INIT to MF_SEARCH_STATE_SEARCH + * Return value: This function returns zero on success, or negative value. + **/ +int mf_search_start(mf_search_handle handle, + const char **root_path, + unsigned int path_num, + const char *needle, + mf_search_option option, + void *user_data, + mf_search_filter_cb func, + int category); +/** + * mf_search_stop: + * @handle: the handle of mf_search + * Stops search + * If success, #mf_search state is changed from MF_SEARCH_STATE_SEARCH to MF_SEARCH_STATE_INIT + * Return value: This function returns zero on success, or negative value. + **/ +int mf_search_stop(mf_search_handle handle); + +/** + * mf_search_stop: + * @handle: the handle of mf_search + * Finalizes search @handle + * #mf_search state is changed from MF_SEARCH_STATE_INIT to MF_SEARCH_STATE_NONE + **/ +void mf_search_finalize(mf_search_handle *handle); + + +/*+++++++++++++++++++++++ UTIL APIs +++++++++++++++++++++++*/ + +/** + * mf_search_result_dir_get: + * @result: the handle of search result + * Gets one of directory name in given search @result + * Return value: a directory name which is a newly-allocated string that must be freed after use + * or NULL if no more result for directory. + **/ +char *mf_search_result_dir_get(mf_search_result_t *result); + +/** + * mf_search_result_file_get: + * @result: the handle of search result + * Gets one of file name given search @result + * Return value: a file name which is a newly-allocated string that must be freed after use + * or NULL if no more result for directory. + **/ +char *mf_search_result_file_get(mf_search_result_t *result); + +/** + * mf_search_result_current_dir_get: + * @result: the handle of search result + * Gets current searching directory name in given search @result + * Return value: current searching directory name which is a newly-allocated string that must be freed after use + * or NULL if fail to get current searching directory name. + **/ +char *mf_search_result_current_dir_get(mf_search_result_t *result); + +/** + * mf_search_result_is_end: + * @result: the handle of search result + * @is_end : If @result is last result handle, set it to a non-zero value, if not set it to zero. + * Tests if given search @result is the last one or not + * Return value: This function returns zero on success, or negative value. + **/ +int mf_search_result_is_end(mf_search_result_t *result, int *is_end); + +/** + * mf_search_result_total_count_get: + * @result: the handle of search result + * @count: the items(which is explored directories and files) count. + * Gets current explored items(this is not result count) + * Return value: This function returns zero on success, or negative value. + **/ +int mf_search_result_total_count_get(mf_search_result_t *result, unsigned int *count); + +void mf_search_bar_item_append(void *data, void *user_data); + +#endif diff --git a/src/include/mf-sensor.h b/src/include/mf-sensor.h new file mode 100644 index 0000000..f3f9b1c --- /dev/null +++ b/src/include/mf-sensor.h @@ -0,0 +1,36 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __MF_SENSOR_H__ +#define __MF_SENSOR_H__ + +typedef enum{ + MF_MOTION_FACEDOWN = 0x01, + MF_MOTION_DOUBLETAP, +}mf_motion_type; + +typedef void (*mf_sensor_cb)(unsigned long long timestamp, void *user_data); + +int mf_sensor_init(void); +int mf_sensor_finalize(void); +int mf_sensor_start(mf_motion_type type); +int mf_sensor_stop(mf_motion_type type); +int mf_sensor_set_callback(mf_motion_type type, mf_sensor_cb callback, void *user_data); +int mf_sensor_unset_callback(mf_motion_type type); + +#endif + diff --git a/src/include/mf-share.h b/src/include/mf-share.h new file mode 100644 index 0000000..9055ec2 --- /dev/null +++ b/src/include/mf-share.h @@ -0,0 +1,42 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __MF_SHARE_H__ +#define __MF_SHARE_H__ + +#define SHARE_FILE_MODE_NORMAL 0x01 +#define SHARE_FILE_MODE_IMAGE 0x02 +#define SHARE_FILE_MODE_VIDEO 0x04 +#define SHARE_FILE_MODE_MULTI_IMAGE 0x10 +#define SHARE_FILE_MODE_MULTI_VIDEO 0x20 +#define SHARE_FILE_MODE_OTHERS 0x40 + +typedef enum __share_mode_e share_mode_e; +enum __share_mode_e { + SHARE_MODE_NORMAL, + SHARE_MODE_IMAGE, + SHARE_MODE_IMAGE_VIDEO, + SHARE_MODE_VIDEO, + SHARE_MODE_MULTI_IMAGE, + SHARE_MODE_MULTI_VIDEO, + SHARE_MODE_MAX +}; + +void mf_share_launch_multi_file(void *data); +int mf_share_mode_get(Eina_List * selected_list); + +#endif diff --git a/src/include/mf-split-view.h b/src/include/mf-split-view.h new file mode 100644 index 0000000..118e146 --- /dev/null +++ b/src/include/mf-split-view.h @@ -0,0 +1,33 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#ifndef __MF_SPLIT_VIEW_H_ +#define __MF_SPLIT_VIEW_H_ +bool mf_split_view_refresh(void *data); +void mf_split_view_left_genlist_refresh(void *data); +void mf_split_view_show(void *data); +void mf_split_view_hide(void *data); +void mf_split_view_destory(void *data); +void mf_split_view_init(void *data); +void mf_split_view_path_info_update(Evas_Object *label, const char *fullpath, Eina_Bool root); +void mf_split_view_unset_right_content(void *data); +void mf_split_view_genlist_append(void *data, Evas_Object *pGenlist, GString *fullpath, Elm_Object_Item *parent_item); + +#endif + diff --git a/src/include/mf-ta.h b/src/include/mf-ta.h new file mode 100644 index 0000000..e8bb3d1 --- /dev/null +++ b/src/include/mf-ta.h @@ -0,0 +1,130 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + +#ifndef _MF_TA_H_ +#define _MF_TA_H_ + + +#ifdef MYFILE_USE_TA + +/* defs. */ +#define MF_TA_MAX_CHECKPOINT 500 +#define MF_TA_MAX_ACCUM 500 +#define MF_TA_BUFF_SIZE 256 + +typedef struct _mf_ta_checkpoint mf_ta_checkpoint; +struct _mf_ta_checkpoint { + unsigned long timestamp; + char *name; +}; + +typedef struct _mf_ta_accum_item mf_ta_accum_item; +struct _mf_ta_accum_item { + unsigned long elapsed_accum; + unsigned long num_calls; + unsigned long elapsed_min; + unsigned long elapsed_max; + unsigned long first_start; + unsigned long last_end; + + char *name; + + unsigned long timestamp; + int on_estimate; + int num_unpair; +}; + +#define MF_TA_SHOW_STDOUT 0 +#define MF_TA_SHOW_STDERR 1 +#define MF_TA_SHOW_FILE 2 +#define MF_TA_RESULT_FILE "/tmp/myfile-ta.log" + + +/* COMMON */ +int mf_ta_init(void); +int mf_ta_release(void); +void mf_ta_set_enable(int enable); +char *mf_ta_fmt(const char *fmt, ...); + + +/* CHECK POINT */ +int mf_ta_add_checkpoint(char *name, int show, char *filename, int line); +void mf_ta_show_checkpoints(void); +void mf_ta_show_diff(char *name1, char *name2); + +int mf_ta_get_numof_checkpoints(); +unsigned long mf_ta_get_diff(char *name1, char *name2); + +/* ACCUM ITEM */ +int mf_ta_accum_item_begin(char *name, int show, char *filename, int line); +int mf_ta_accum_item_end(char *name, int show, char *filename, int line); +void mf_ta_show_accum_result(int direction); + +/* macro. */ +#define MF_TA_INIT() (mf_ta_init()) +#define MF_TA_RELEASE() (mf_ta_release()) +#define MF_TA_SET_ENABLE(enable) (mf_ta_set_enable(enable)) + +/* checkpoint handling */ +#define MF_TA_ADD_CHECKPOINT(name, show) (mf_ta_add_checkpoint(name, show, __FILE__, __LINE__)) +#define MF_TA_SHOW_CHECKPOINTS() (mf_ta_show_checkpoints()) +#define MF_TA_SHOW_DIFF(name1, name2) (mf_ta_show_diff(name1, name2)) +#define MF_TA_GET_NUMOF_CHECKPOINTS() (mf_ta_get_numof_checkpoints()) +#define MF_TA_GET_DIFF(name1, name2) (mf_ta_get_diff(name1, name2)) + +/* accum item handling */ +#define MF_TA_ACUM_ITEM_BEGIN(name, show) (mf_ta_accum_item_begin(name, show, __FILE__, __LINE__)) +#define MF_TA_ACUM_ITEM_END(name, show) (mf_ta_accum_item_end(name, show, __FILE__, __LINE__)) +#define MF_TA_ACUM_ITEM_SHOW_RESULT() (mf_ta_show_accum_result(MF_TA_SHOW_STDOUT)) +#define MF_TA_ACUM_ITEM_SHOW_RESULT_TO(x) (mf_ta_show_accum_result(x)) +/* +#define __mf_ta__(name, x) \ +MF_TA_ACUM_ITEM_BEGIN(name, 0); \ +x \ +MF_TA_ACUM_ITEM_END(name, 0); + +*/ + +#else /*#ifdef MYFILE_USE_TA*/ + +#define MF_TA_INIT() +#define MF_TA_RELEASE() +#define MF_TA_SET_ENABLE(enable) + +/* checkpoint handling */ +#define MF_TA_ADD_CHECKPOINT(name, show) +#define MF_TA_SHOW_CHECKPOINTS() +#define MF_TA_SHOW_DIFF(name1, name2) +#define MF_TA_GET_NUMOF_CHECKPOINTS() +#define MF_TA_GET_DIFF(name1, name2) +/* #define MF_TA_GET_NAME(idx) */ + +/* accum item handling */ +#define MF_TA_ACUM_ITEM_BEGIN(name, show) +#define MF_TA_ACUM_ITEM_END(name, show) +#define MF_TA_ACUM_ITEM_SHOW_RESULT() +#define MF_TA_ACUM_ITEM_SHOW_RESULT_TO(x) +/* +#define __mf_ta__(name, x) +*/ +#endif /*#ifdef MYFILE_USE_TA */ + +#endif diff --git a/src/include/mf-tray-item.h b/src/include/mf-tray-item.h new file mode 100644 index 0000000..a9d69e3 --- /dev/null +++ b/src/include/mf-tray-item.h @@ -0,0 +1,57 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MF_TRAY_H_ +#define _MF_TRAY_H_ + +#include + +#include "mf-conf.h" +#include "mf-fs-util.h" + +#define MF_ICON_SHORTCUT_IMAGE ICON_PATH"/myfile_icon_shortcut_image.png" +#define MF_ICON_SHORTCUT_VIDEO ICON_PATH"/myfile_icon_shortcut_video.png" +#define MF_ICON_SHORTCUT_SOUNDS ICON_PATH"/myfile_icon_shortcut_sound.png" +#define MF_ICON_SHORTCUT_DOCUMENT ICON_PATH"/myfile_icon_shortcut_document.png" +#define MF_ICON_SHORTCUT_OTHERS ICON_PATH"/myfile_icon_shortcut_others.png" + +#define MF_ICON_SHORTCUT_IMAGE_PRESS ICON_PATH"/myfile_icon_shortcut_image_press.png" +#define MF_ICON_SHORTCUT_VIDEO_PRESS ICON_PATH"/myfile_icon_shortcut_video_press.png" +#define MF_ICON_SHORTCUT_SOUNDS_PRESS ICON_PATH"/myfile_icon_shortcut_sound_press.png" +#define MF_ICON_SHORTCUT_DOCUMENT_PRESS ICON_PATH"/myfile_icon_shortcut_document_press.png" +#define MF_ICON_SHORTCUT_OTHERS_PRESS ICON_PATH"/myfile_icon_shortcut_others_press.png" + + +#ifdef MYFILE_TRAY_FEATURE + +typedef enum __mf_tray_item_category mf_tray_item_category; +enum __mf_tray_item_category{ + mf_tray_item_category_none, + mf_tray_item_category_image, + mf_tray_item_category_video, + mf_tray_item_category_sounds, + mf_tray_item_category_document, + mf_tray_item_category_others, + mf_tray_item_category_max +}; + +Evas_Object *mf_tray_create(Evas_Object *parent, void *data); +int mf_tray_item_type(const char *path); + +#endif + +#endif diff --git a/src/include/mf-util.h b/src/include/mf-util.h new file mode 100644 index 0000000..965dce9 --- /dev/null +++ b/src/include/mf-util.h @@ -0,0 +1,302 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + +#ifndef __DEF_MYFILE_UTIL_H_ +#define __DEF_MYFILE_UTIL_H_ + +#include +#include + +#include +#include +#include +#include +#include "mf-fo-common.h" +#include "mf-fs-util.h" + +#define MF_SCALE_FACTORY elm_config_scale_get() +#define SAFE_FREE_CHAR(x) do {\ + if ((x) != NULL) {\ + free(x); \ + x = NULL;\ + } \ + } while (0) + +#define SAFE_FREE_GSTRING(x) do {\ + if ((x) != NULL) {\ + g_string_free(x, TRUE); \ + x = NULL;\ + } \ + } while (0) + +#define CHAR_CHECK_NULL_GOTO(arg, dest) do {\ + if ((arg) == NULL) {\ + goto dest;\ + } \ + } while (0) + +#define GSTRING_CHECK_NULL_GOTO(arg, dest) do {\ + if ((arg) == NULL || (arg->str) == NULL) {\ + goto dest;\ + } \ + } while (0) + +#define SAFE_TIMER_DEL(x) do {\ + if ((x) != NULL) {\ + ecore_timer_del(x); \ + x = NULL;\ + } \ + } while (0) + +#define SAFE_DEL_NAVI_ITEM(x) do {\ + if ((x) != NULL) {\ + elm_object_item_del(x); \ + x = NULL;\ + } \ + } while (0) + +#define SAFE_DEL_ECORE_TIMER(timer) do { \ + if (timer) { \ + ecore_timer_del(timer);\ + timer = NULL; \ + } \ + } while (0) + +#define SAFE_FREE_OBJ(x) do {\ + if ((x) != NULL) {\ + evas_object_del(x); \ + x = NULL;\ + } \ + } while (0) + +#define SAFE_STRCPY(dest, src) \ + do{if(!dest||!src)break;\ + strncpy (dest , src, sizeof(dest)-1);\ + dest[sizeof(dest)-1] = 0; }while(0) + +#define mf_ecore_idler_del(idler) do { \ + if(idler) { \ + ecore_idler_del(idler);\ + idler = NULL; \ + } \ + } while (0) + +#define SAFE_FREE_ECORE_EVENT(event) do { \ + if (event) { \ + ecore_event_handler_del(event);\ + event = NULL; \ + } \ + } while (0) + +typedef enum _MF_INTERNAL_NAME_ERR MF_INTERNAL_NAME_ERR; +enum _MF_INTERNAL_NAME_ERR { + MF_INTERNAL_FILE_NAME_NULL = 1, + MF_INTERNAL_FILE_NAME_EMPTY, + MF_INTERNAL_FILE_NAME_IGNORE, + MF_INTERNAL_FILE_NAME_CHUG, + MF_INTERNAL_FILE_NAME_MAX_LENGTH, + MF_INTERNAL_FILE_NAME_INVALID_CHAR, +}; + +typedef enum _MF_THEME_TYPE MF_THEME_TYPE; +enum _MF_THEME_TYPE { + THEME_INVALID = -1, + THEME_NBEAT = 0, + THEME_NBEAT_BLACK = 1, + THEME_ERROR +}; + +typedef enum __mf_thumbnail_type mf_thumbnail_type; +enum __mf_thumbnail_type { + MF_THUMBNAIL_TYPE_DEFAULT, + MF_THUMBNAIL_TYPE_THUMBNAIL, + MF_THUMBNAIL_TYPE_MAX +}; + +#define MYFILE_MAGIC_MAIN_CONTEXT (0x1983cdaf) +#define MYFILE_MAGIC_DETAIL_LIST_ITEM (0x1977abcd) +#define MYFILE_MAGIC_PIPE_DATA (0x0716ffcc) + +#define MYFILE_FINISH_MMC_INIT_DATA "db/Apps/FileManager/FinishMmcInitData" + +#define MYFILE_MAGIC unsigned int __magic +#define MYFILE_MAGIC_SET(d, m) (d)->__magic = (m) +#define MYFILE_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m))) + +#define MYFILE_DBUS_SIGNAL_INTERFACE "app.fexplorer.dbus.Signal" +#define MYFILE_DBUS_SIGNAL_PATH "/app/fexplorer/dbus" +#define MAX_LEN_VIB_DURATION 0.5 + +typedef enum _MORE_TYPE MORE_TYPE; +enum _MORE_TYPE { /* softkey / contextual popup */ + MORE_DEFAULT = 0, + MORE_EDIT, + MORE_SHARE_EDIT, + MORE_CREATE_FOLDER, + MORE_DELETE, + MORE_IDLE_DELETE, + MORE_DATA_COPYING, + MORE_DATA_MOVING, + MORE_INTERNAL_COPY_MOVE, + MORE_INTERNAL_COPY, + MORE_INTERNAL_MOVE, + MORE_THUMBNAIL_RENAME, + MORE_RENAME, + MORE_SEARCH, + MORE_SENDVIABLUETOOTH, + MORE_SENDVIAEMAIL, + MORE_SENDVIAMESSAGE, + MORE_TYPE_MAX +}; + +typedef enum __mf_view_type_e mf_view_type_e; +enum __mf_view_type_e { + mf_view_root = 0, + mf_view_root_category, + mf_view_normal, +}; + +typedef enum _LAUNCH_TYPE LAUNCH_TYPE; +enum _LAUNCH_TYPE { + LAUNCH_TYPE_FORK = 0, + LAUNCH_TYPE_FAKE, + LAUNCH_TYPE_FAIL, + LAUNCH_TYPE_DIR, + LAUNCH_TYPE_UNSUPPORT, + LAUNCH_TYPE_MAX +}; + + +typedef enum _REPORT_TYPE REPORT_TYPE; +enum _REPORT_TYPE { + MYFILE_REPORT_NONE = 1, + MYFILE_REPORT_RECURSION_DETECT, + MYFILE_REPORT_BOTH_ARE_SAME_FILE, + MYFILE_REPORT_MAX, +}; + +typedef enum _MYFILE_FILE_NAME_TYPE MYFILE_FILE_NAME_TYPE; +enum _MYFILE_FILE_NAME_TYPE { + FILE_NAME_WITH_BRACKETS, + FILE_NAME_WITH_UNDERLINE, + FILE_NAME_NONE, +}; + +typedef enum _MYFILE_CONTENT_TYPE MYFILE_CONTENT_TYPE; +enum _MYFILE_CONTENT_TYPE { + MYFILE_TYPE_MIN, + MYFILE_TYPE_GSTRING, + MYFILE_TYPE_CHAR, + MYFILE_TYPE_FSNODE, + MYFILE_TYPE_MAX +}; + +struct _mtd { + char *category; + char *key; + char *icon_path; + char *exe_path; + char *param; + int is_direct_launch; + int need_sort_param; + int having_a_thumbnail; +}; + + +typedef enum _MYFILE_VCONF_TYPE MYFILE_VCONF_TYPE; +enum _MYFILE_VCONF_TYPE { + VCONF_TYPE_SORT_TYPE = 0, + VCONF_TYPE_TIME_FORMAT, + VCONF_TYPE_DATE_FORMAT, + VCONF_TYPE_MASS_STORAGE, + VCONF_TYPE_VIEW_STYLE, + VCONF_TYPE_NFC_ENABLE, + VCONF_TYPE_EXTENSION_STATE, + VCONF_TYPE_MAX +}; + +void mf_callback_warning_popup_cb(void *data, Evas_Object *obj, void *event_info); +int keydown_cb(void *data, int type, void *event); + +void ime_mkdir_callback_cb(void *data); +void ime_rename_callback_cb(void *data); +void add_panel_to_softkey(Evas_Object *obj, int mode); +void create_popup(void *data, char *header, Evas_Smart_Cb func); +void softkey_cb(void *data, Evas_Object *obj, void *event_info); +void tab_cb(void *data, Evas_Object *obj, void *event_info); +int keydown_cb(void *data, int type, void *event); +int copy_files(char *src, char *dst); + +void file_selection_popup_cb(void *data, Evas_Object *obj, void *event_info); +int set_default_state_as(int state); + +bool mf_util_check_forbidden_operation(void *data); +int mf_util_check_disk_space(void *data); + +void operation_abort(void *data); +void myfile_recovery_after_cancel(); +void myfile_mmc_in_out_cb(void *data); + +int mf_util_refresh_screen(void *data); +int mfScreenReset(void *data); +int mf_util_is_mmc_on(int *mmc_card); +int mf_util_is_otg_on(int *otg); +int mf_util_get_eina_list_len(const Eina_List *list); +void mf_util_free_eina_list_with_data(Eina_List **list, MYFILE_CONTENT_TYPE type); +void mf_util_operation_alloc_failed(void *data); +void mf_util_action_storage_insert(void *data, char *pItemLabel); +int mf_util_get_vconf_value(MYFILE_VCONF_TYPE type, int *value); +void mf_util_set_sort_type(int value); +void mf_util_merge_eina_list_to_glist(const Eina_List *eSource, GList **gSource); +void mf_util_exception_func(void *data); +int mf_util_is_valid_name_check(const char *name); +void mf_util_ex_disk_list_update(void *data); +long mf_util_character_count_get(const char *original); +/**ecore_*** handler related**/ +void mf_util_add_to_handler_list(void *data, Ecore_Job *handler, char *label); +void mf_util_delete_from_handler_list(void *data, char *label, bool flag_del); +void mf_util_clear_handler_list(void *data); +char *mf_util_upper_folder_name_get(void *data, GString *fullpath); +/**icu related**/ +char *mf_util_get_icu_date(fsNodeInfo *pNode); +int mf_util_icu_init(void *data); +void mf_util_icu_finalize(void *data); +char *mf_util_icu_translate(void *data, UDate date); +void mf_util_set_pm_lock(void *data, Eina_Bool isLock); +Eina_List *mf_util_get_all_selected(void *data); +gboolean mf_util_is_file_selected(Eina_List **source, GString *path); +MF_THEME_TYPE mf_util_get_theme(void); +void mf_util_sort_the_file_list(void *data); +int mf_util_generate_file_list(void *data); +char *mf_util_get_text(const char *ID); +void mf_util_set_view_style(int value); +void mf_util_rotate_state_set(void *data, app_device_orientation_e rotate_mode); +int mf_util_generate_root_view_file_list(void *data, Eina_List **list, int storage_state); +void mf_util_set_extension_state(int value); +const char *mf_util_search_markup_keyword(const char *string, char *searchword, bool *result); +void mf_util_set_recent_file(char *path); +Eina_List *mf_util_get_all_selected_items(void *data); +void mf_util_remove_item_from_list_by_location(Eina_List **list, int location); +void mf_util_generate_list(Eina_List **list, const char *path, int file_type); +bool mf_util_is_rotation_lock(void); +void mf_util_remove_item_from_list_by_name(Eina_List **list, const char *path); +fsNodeInfo *mf_util_generate_pnode(const char *path, int file_type); +void mf_util_update_item_from_list_by_name(Eina_List **list, const char *path, char *new_name); +#endif /* __DEF_MYFILE_UTIL_H_ */ diff --git a/src/include/mf-widget.h b/src/include/mf-widget.h new file mode 100644 index 0000000..7b39566 --- /dev/null +++ b/src/include/mf-widget.h @@ -0,0 +1,399 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __DEF_MYFILE_WINSET_H_ +#define __DEF_MYFILE_WENSET_H_ + +#include +#include +#include + + +#include "mf-conf.h" +#include "mf-fs-util.h" +#include "mf-callback.h" +#include "mf-split-view.h" +#include "mf-gengrid.h" +#include "mf-dlog.h" +#include "mf-resource.h" + + +#define NAVI_MORE_BUTTON_PART "toolbar_more_btn" +#define NAVI_BOTTOM_BUTTON_1_PART "toolbar_button1" +#define NAVI_BOTTOM_BUTTON_2_PART "toolbar_button2" +#define NAVI_BUTTON_STYLE "naviframe/toolbar/default" +#define NAVI_BUTTON_EDIT "naviframe/more/default" + +#define CTRL_STYLE_TYPE "controlbar" +#define TITLE_LEFT_BTN "title_left_btn" +#define TITLE_RIGHT_BTN "title_right_btn" +#define TITLE_BTN_STYLE "elm/button/base/naviframe/title_icon" + +/*********** Layout APIs ***********/ +Evas_Object *mfCreateLayout(Evas_Object *parent, char *label, void(*_back_cb)(void *, Evas_Object *, void *), void *data); +void mfDeleteLayout(Evas_Object *pLayout); + +/*********** TabBar APIs ***********/ +Evas_Object *mf_tab_bar_create_tab_bar(Evas_Object *parent); +Elm_Object_Item *mf_tab_bar_append_item(Evas_Object *pTabBar, char *pTabIconPath, char *pTabBarLabel, void *user_data); +void mf_tab_bar_set_selected_item(Elm_Object_Item *pItem); +void mf_tab_bar_set_item_view(Evas_Object *parent, Evas_Object *tab_layout, Evas_Object *view); +void mf_tab_bar_set_item_disabled(Evas_Object *pTabBar, Eina_Bool disable); +Elm_Object_Item *mf_tab_bar_get_item_by_label(Evas_Object *pTabBar, char *pTabLabel); +int mf_tab_bar_items_count_get(Evas_Object *pTabBar); +void mf_tab_bar_items_del(Evas_Object *pTabBar); +void mf_tab_bar_generate(void *data); + +/*********** Control Bar Definitions ***********/ +#define EDIT_SEG_COUNT 3 +#define OPER_SEG_COUNT 5 + +#define MF_CTRL_ICON_NEW_FOLDER_CREATE ICON_PATH"/myfile_icon_create_folder.png" +#define MF_CTRL_ICON_LIST_BY ICON_PATH"/myfile_icon_list_by.png" +#define MF_CTRL_ICON_EDIT ICON_PATH"/myfile_icon_edit.png" +#define MF_CTRL_ICON_COPY ICON_PATH"/myfile_icon_copy.png" +#define MF_CTRL_ICON_MOVE ICON_PATH"/myfile_icon_move.png" +#define MF_CTRL_ICON_PASTE_HERE ICON_PATH"/myfile_icon_paste_here.png" +#define MF_CTRL_ICON_MOVE_HERE ICON_PATH"/myfile_icon_move_here.png" +#define MF_CTRL_ICON_DELETE ICON_PATH"/myfile_icon_delete.png" +#define MF_CTRL_ICON_SEND ICON_PATH"/myfile_icon_share.png" +#define MF_CTRL_ICON_STORE_HERE ICON_PATH"/myfile_icon_store_here.png" +#define MF_CTRL_ICON_CANCEL ICON_PATH"/myfile_icon_cancel.png" +#define MF_CTRL_ICON_SAVE ICON_PATH"/myfile_icon_done.png" +#define MF_CTRL_ICON_SEARCH ICON_PATH"/myfile_icon_search.png" +#define MF_TITLE_ICON_HOME ICON_PATH"/Controlbar/U01_controlbar_cion_home.png" +#define MF_TITLE_ICON_HOME_PRESS ICON_PATH"/Controlbar/U01_controlbar_cion_home_press.png" +#define MF_TITLE_ICON_UPPER ICON_PATH"/Controlbar/U01_controlbar_cion_up_folder.png" +#define MF_TITLE_ICON_UPPER_PRESS ICON_PATH"/Controlbar/U01_controlbar_cion_up_folder_press.png" +#define MF_TITLE_ICON_SELECT_ALL ICON_PATH"/00_icon_select_all_web.png" +#define MF_TITLE_ICON_SELECT_ALL_PRESS ICON_PATH"/00_icon_select_all_press_web.png" +#define MF_TITLE_ICON_SELECT_ALL_DIM ICON_PATH"/00_icon_select_all_dim_web.png" + +typedef enum _eCtrlBarButtonType eCtrlBarButtonType; +enum _eCtrlBarButtonType { + CTRL_BUTTON_NEW_FOLDER_CREATE = 0, + CTRL_BUTTON_LIST_BY, + CTRL_BUTTON_EDIT, + CTRL_BUTTON_COPY, + CTRL_BUTTON_MOVE, + CTRL_BUTTON_DELETE, + CTRL_BUTTON_SEND, + CTRL_BUTTON_PASTE_HERE, + CTRL_BUTTON_MOVE_HERE, + CTRL_BUTTON_CANCEL, + CTRL_BUTTON_SAVE, + CTRL_BUTTON_COPY_MOVE, + CTRL_BUTTON_SEARCH, + CTRL_BUTTON_MAX +}; + +/*********** Control Bar APIs ***********/ +Evas_Object *mf_ctrl_bar_create(void *data, Evas_Object *parent); +void mf_ctrl_bar_item_set_disable(Evas_Object *ctrl_bar, int disable_item, bool disable); +void mf_ctrl_bar_reset(void *data); +int mf_ctrl_bar_item_get_disable(Evas_Object *ctrl_bar); + + +/*********** Navigation Bar Definition ************/ +#define MF_POPUP_TIMEOUT_NORMAL 3 +#define MF_POPUP_TIMEOUT_SHORT 2 + +typedef enum { + NAVI_BAR_MIN = 0, + NAVI_BAR_DEFAULT, /*when MMC is on, show All/Phone/Memory Card together OR when copy/move show phone and mmc*/ + NAVI_BAR_TITLE, /*when MMC is off, show "myfile" only*/ + NAVI_BAR_PATH_WITH_ONE_ACTION, + NAVI_BAR_PATH_WITH_TWO_ACTION, + NAVI_BAR_MAX +} eNaviBarStyle; + + +/*********** Navigation Bar API ************/ +#define MF_NAVI_STYLE_ENABLE "basic" +#define MF_NAVI_STYLE_DISABLE "basic/instant" + +typedef enum _MF_NAVIFRAME_ITEM_DEL_TYPE { + MF_NAVIFRAME_ITEM_DEL_DIRECTLY, + MF_NAVIFRAME_ITEM_DEL_BY_NAVI +}MF_NAVIFRAME_ITEM_DEL_TYPE; + +typedef enum __mf_notify_popup_type { + mf_notify_popup_normal, + mf_notify_popup_layout +}mf_notify_popup_type; + +typedef enum __mf_navi_btn_type mf_navi_btn_typ; +enum __mf_navi_btn_type { + MF_NAVI_BTN_MORE = 0, + MF_NAVI_BTN_SHARE, + MF_NAVI_MORE_MAX +}; + + +Evas_Object *mf_navi_bar_create_navi_bar(Evas_Object *parent); +Evas_Object *mfNaviBarConformGet(void *data); +void mf_navi_bar_set_ctrl_bar(struct appdata *data); +Evas_Object *mf_navi_bar_get_content(Evas_Object *pConform); +void mf_navi_bar_set_style(void *data, eNaviBarStyle navi_style, Evas_Object *NaviContent); +void mf_navi_bar_set_selected_count_label(void *data, int dir_count, int file_count); +void mf_navi_bar_create_default_view(void *data); +void mf_navi_bar_create_edit_view(void *data); +void mf_navi_bar_create_path_select_view(void *data); +void mf_navi_bar_create_path_select_view_otg_root(void *data); +void mf_navi_bar_create_search_view(void *data); +myfileNaviBar *mf_navi_bar_get_in_use(void *data); +void mf_navi_bar_object_reset(myfileNaviBar *pNavi_s); +bool mf_navi_bar_remove_list_item_by_label(void *data, const char *pNaviLabel); +myfileNaviBar *mf_navi_bar_get_struct_by_label(void *data, const char *pNaviLabel); +void mf_navi_bar_refresh_recovered_view(void *data, myfileNaviBar * pNaviStruct); +myfileNaviBar *mf_navi_bar_recover_list(void *data); +myfileNaviBar *mf_navi_bar_get_edit_start(void *data); +bool mf_navi_bar_is_navi_empty(void *data, char *label); +Evas_Object *mf_navi_bar_get_box_end(Evas_Object * pBox); +void mf_navi_bar_set_upper_item_disable(void *data, bool bFlag); +void mf_navi_bar_recover_info_box(void *data, myfileNaviBar *pNavi_s); +void mf_navi_bottom_item_del(Elm_Object_Item **pPreNaviItem); +Evas_Object *mf_navi_bar_get_edit_genlist(void *data); +Evas_Object *mf_navi_bar_upper_create(Evas_Object *parent); +void mf_navi_bar_remove_back_button(Elm_Object_Item *pNaviItem); +Evas_Object *mf_navi_bar_pathinfo_label_create(Evas_Object *parent, char *pathinfo); +void mfNaviBarSetContent(void *data, Evas_Object *pLayout, Evas_Object *NaviContent); +myfileNaviBar *mf_navi_bar_get_navi_from_navilist(Eina_List *navilist, const char *label); +void mf_navi_bar_transition_finished_cb(void *data, Evas_Object *obj, void *event_info); +void mf_navi_bar_remove_previous_contents(void *data, Evas_Object *pNaviBar); +void mf_navi_add_back_button(void *data); +void mf_navi_bar_del_item_directly(void *data); +Evas_Object *mf_navi_bar_content_create(void *data); +void mf_navi_bar_edit_list_update(void *data); +void mf_navi_bar_reset_panes_main(void *data); +void mf_navi_bar_create_rename_view(void *data); +void mf_navi_bar_title_set(void *data); +Evas_Object *mf_navi_bar_create_header_box(void *data); +void mf_navi_bar_reset_ctrl_button(void *data); +void mf_navi_bar_button_set_disable(Elm_Object_Item *navi_it, int disable_item, bool disable); +int mf_navi_bar_button_get_disable(Elm_Object_Item *navi_it); +void mf_navi_bar_set_panes_navi_to_main(void *data); + +/*********** Content Definition ************/ +#define INTERVAL_THUMB_UPDATE 0.5 + +typedef struct { + GString *m_ItemName; + char *size; + char *create_date; + char *thumb_path; + Eina_Bool m_checked; + bool real_thumb_flag; + int flagExpand; + Evas_Object *pCheckBox; + Elm_Object_Item *item; + bool unregister_lang_mgr; + media_info_h media; + struct appdata *ap; +} mfItemData_s; + +typedef enum __eMfViewStyle { + MF_VIEW_STYLE_LIST, + MF_VIEW_SYTLE_LIST_DETAIL, + MF_VIEW_STYLE_THUMBNAIL, +}eMfViewStyle; + +/*********** Content API ************/ +void mf_genlist_get_list_selected_files(Evas_Object * pGenlist, Eina_List **list); +Evas_Object *mf_genlist_create_list(void *data, Evas_Object *parent); +Evas_Object *mfSearchResultListView(void *data); +Evas_Object *mf_genlist_create_list_new_folder_style(void *data); +void mf_genlist_sweep_item_recover(Evas_Object *obj); +void mf_genlist_create_list_default_style(Evas_Object *pGenlist, void *data, Eina_List *dir_list, + Eina_List *file_list); +int mf_util_generate_list_data(const char *path, Eina_List ** default_dir_list, Eina_List ** user_dir_list, Eina_List ** file_list); + +void mf_genlist_update_default_view_item_style(void *data); +void mf_genlist_update_edit_view_item_style(void *data); +void mf_genlist_clear(Evas_Object *genlist); +void mf_genlist_rename_done(void *data, Evas_Object *obj, void *event_info); +#ifdef MYFILE_SPLIT_VIEW +Elm_Object_Item *mf_genlist_split_root_item_append(void *data, Evas_Object *pGenlist, const char *name); +void mf_genlist_split_left_genlist_style(void *data); +void mf_genlist_split_root_items_append(Evas_Object *pGenlist, void *data); +Elm_Object_Item *mf_genlist_split_left_items_append( void *data, Evas_Object *pGenlist, Elm_Object_Item *parent_item, Eina_List *dir_list); +#endif +Evas_Object *mf_genlist_create_list_rename_style(void *data); +void mf_genlist_create_search_itc(); +void mf_genlist_get_list_selected_items(Evas_Object * pGenlist, Eina_List **list); +void mf_genlist_gl_sel(void *data, Evas_Object * obj, void *event_info); +void mf_genlist_create_data(mfItemData_s **m_TempItem, const char *name, void *data); + + +/*********** Popup Definition ************/ +typedef struct _StorageData_s StorageData_s; + +struct _StorageData_s{ + char *label; + int index; + bool unregister_lang_mgr; + Elm_Object_Item *item; + struct appdata *ap; +} ; + +typedef enum { + POPMODE_MIN = 0, + POPMODE_TEXT, + POPMODE_TITLE_TEXT, + POPMODE_TEXT_NOT_DISABLED, + POPMODE_TEXT_TWO_BTN, + POPMODE_TITLE_TEXT_TWO_BTN, + POPMODE_TEXT_BTN, + POPMODE_TITLE_TEXT_BTN, + POPMODE_TITLE_TEXT_THREE_BTN, + POPMODE_PROGRESSBAR, + POPMODE_TITLE_LIST_BTN, + POPMODE_VIEW_AS_LIST, + POPMPDE_MAX +} ePopMode; + +typedef enum { + ELM_POPUP_NONE, + ELM_POPUP_YES, + ELM_POPUP_NO, + ELM_POPUP_OK, + ELM_POPUP_CANCLE, + ELM_POPUP_AUTO_RENAME, + ELM_POPUP_REPLACE, + ELM_POPUP_PHONE, + ELM_POPUP_MEMORY, + ELM_POPUP_MOVE, + ELM_POPUP_DELETE, + ELM_POPUP_MAX +} ePopInfo; + +typedef struct _myfilePopupListData { + int index; + bool unregister_lang_mgr; + Elm_Object_Item *item; + struct appdata *ap; +} myfilePopupListData; + + +/*********** Popup API ************/ +Evas_Object *mf_popup_create_popup(void *data, ePopMode popupMode, char *title, const char *context, const char *first_btn_text, const char *second_btn_text, + const char *third_btn_text, Evas_Smart_Cb func, void *param); +Evas_Object *mf_popup_create_pb_popup(void *data, char *context, int file_count, void *func, void *param); +void mf_popup_indicator_popup(void *data, const char *text); +/*********** Search Bar API ************/ +Evas_Object *mfSearchBarCreate(void *data); + +/***********RenameView API***********/ +void rename_item_add(mfItemData_s *data); +void mfTitleStyleSet(void *data, int titleStyle, char *title, char *leftbtn, char *rightbtn); +void mfTitleSet(void *data, char *title); +void mfTitleCallBackSet(void *data, int titleCbStyle); + + +/****Create New Folder API ***********/ +void mf_navi_bar_create_new_folder_view(void *data); +void mfNewFolderNaviBarSetStyle(myfileNaviBar *pNavi_s, Evas_Object *NaviContent); + + +/****Search Related API ********/ +void mf_search_bar_enter_search_routine(void *data, Evas_Object *obj, void *event_info); +void mf_search_bar_search_started_callback(void *data, Evas_Object *obj, void *event_info); +void mf_search_bar_category_search(void *data, int category); + + + +void __mf_genlist_select_all_layout_mouse_down_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info); +void __mf_genlist_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info); +Evas_Object *mf_widget_create_select_all_layout(Evas_Object *parent); + +void mf_genlist_gl_edit_item_selected(void *data); +void mf_genlist_gl_selected(void *data, Evas_Object * obj, void *event_info); +void mf_genlist_gl_mode_sweep_set(void *data, Evas_Object *obj, void *event_info); +void mf_genlist_gl_mode_sweep_unset(void *data, Evas_Object *obj, void *event_info); +void mf_genlist_gl_mode_cancel(void *data, Evas_Object * obj, void *event_info); +void mf_genlist_set_category_list_style(); + +/************* widget API **************/ + +typedef enum __MF_ROTATE_TYPE { + MF_ROTATE_PORTRAIT, + MF_ROTATE_LANDSCAPE +}MF_ROTATE_TYPE; + +typedef enum __MF_RM_NAVI_ITEM_TYPE { + MF_RM_NAVI_ITEM_DIRECTLY, + MF_RM_NAVI_ITEM_BY_EFFECT +}MF_RM_NAVI_ITEM_TYPE; + +/***************** Context POP *************/ +void mf_context_popup_create_more(void *data, Evas_Object *parent); +int mousedown_cb( void *data, int type, void *event ); +void mf_context_popup_get_more_position(Evas_Object *obj, int *x, int *y); +void mf_context_popup_create_share(void *data, int share_mode, Evas_Object *parent); +void mf_context_popup_create_gengrid(void *data); + +myfileNaviBar *mf_widget_phone_storage_init(void *data); +void mf_widget_refresh_view(void *data); +void mf_widget_set_main_layout_content(void *data); +void mf_widget_create(void *data); +void mf_widget_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h); +Evas_Object *mf_widget_create_select_all_layout(Evas_Object *parent); +Evas_Object *mf_widget_create_no_content(Evas_Object *parent); +Evas_Object *mf_widget_create_check_box(Evas_Object *parent); +Evas_Object *mf_widget_create_conform(Evas_Object * parent); +Evas_Object *mf_widget_create_layout(Evas_Object *parent, const char *edj, const char *grp_name); +Evas_Object *mf_widget_create_box(Evas_Object * parent); +Evas_Object *mf_widget_create_genlist(Evas_Object *parent); +Evas_Object *mf_widget_util_create_button(Evas_Object *parent, char *style, + char *caption, Evas_Object *icon, + void (*func) (void *, Evas_Object *, void *), + void *data); + +void mf_widget_set_navi_blocking(void * data,Eina_Bool is_locked); +void mf_widget_unset_main_layout_content(Evas_Object *layout); +void mf_widget_panes_right_set(Evas_Object *panes, Evas_Object *content); +Evas_Object *mf_widget_create_editfield(Evas_Object *parent, Evas_Object **pEntry); +Evas_Object *mf_widget_button_create(Evas_Object *parent, const char *label); +Evas_Object *mf_widget_create_notify_popup(void *data, + Evas_Object *parent, + char *label, + mf_notify_popup_type type, + bool time_out, + void func(void *data, Evas_Object *obj, void *event_info)); +void mf_widget_items_remove(Evas_Object *parent, int storage, int type); +Evas_Object *mf_widget_unset_part_content(Evas_Object *parent, const char *part); + + +/*************** Widget *********************/ +#ifdef MYFILE_MOTION_FEATURE +void mf_widget_first_item_bring_in(void *data); +#endif + +void mf_widget_create_entryfield(void *data, + Evas_Object *parent, + void (*changed_cb)(void *data, Evas_Object *obj, void *event_info), + void (*click_cb)(void *data, Evas_Object *obj, void *event_info)); +Evas_Object *mf_widget_create_layout_main(Evas_Object * parent); +Evas_Object *mf_widget_create_panes(Evas_Object *parent); +Elm_Object_Item *mf_widget_item_append(Evas_Object *parent, fsNodeInfo *pNode, void *data); +Evas_Object *mf_widget_get_part_content(Evas_Object *parent, const char *part); +void mf_widget_item_remove(Evas_Object *parent, const char *path, int type); +void mf_widget_imf_hide_callback_register(Evas_Object *pConformant, void *data); +void mf_widget_imf_hide_callback_del(Evas_Object *pConformant); + +#endif diff --git a/src/mf-main.c b/src/mf-main.c new file mode 100644 index 0000000..16288f9 --- /dev/null +++ b/src/mf-main.c @@ -0,0 +1,974 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include +#include +#include +#include +#include +#include +#ifdef MYFILE_MOTION_FEATURE +#include "mf-sensor.h" +#endif + + +#include "mf-main.h" +#include "mf-conf.h" +#include "mf-dlog.h" +#include "mf-util.h" +#include "mf-callback.h" +#include "mf-widget.h" +#include "mf-gadget.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-ta.h" +#include "mf-log.h" +#include "mf-otg.h" +#include "mf-launch.h" +#include "mf-language-mgr.h" +#include "mf-s-beam.h" + +#define MF_B_KEY_PATH "path" + +GString *phone_folder_as_param; + +static bool __mf_main_create_app(void *data); +static void __mf_main_terminate_app(void *data); +static void __mf_main_stop_app(void *data); +static void __mf_main_resume_app(void *data); +static void __mf_main_reset_app(service_h service, void *data); +static void __mf_main_storage_status_get(void *data); + +static void __mf_main_data_init(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + /*set state value for create content*/ + ap->mf_Status.more = MORE_DEFAULT; + ap->mf_Status.path = g_string_new(PHONE_FOLDER); + ap->mf_SharedGadget.ug = NULL; + ap->mf_Status.iStorageState = MYFILE_PHONE; + ap->mf_Status.iFolderSortType = MYFILE_SORT_BY_DATE_R2O; + ap->mf_Status.flagLCDLock = EINA_FALSE; + ap->mf_Status.rotation_type = MF_ROTATE_PORTRAIT; + ap->mf_Status.flagNaviPush = EINA_FALSE; + + /* region format related */ + ap->mf_Status.flagIcuInit = FALSE; + ap->mf_Status.generator = NULL; + ap->mf_Status.formatter = NULL; + ap->mf_Status.flagRootView = EINA_TRUE; + ap->mf_Status.flagIME = EINA_TRUE; + ap->mf_Status.view_type = mf_view_root; + ap->mf_Status.preViewType = mf_view_root; + mf_util_get_vconf_value(VCONF_TYPE_NFC_ENABLE, &ap->mf_Status.iNFCState); + mf_util_get_vconf_value(VCONF_TYPE_VIEW_STYLE, &ap->mf_Status.flagViewType); + mf_util_get_vconf_value(VCONF_TYPE_EXTENSION_STATE, &ap->mf_Status.iExtensionState); + + MF_TRACE_END; + +} + +/****************************** +** Prototype : mf_main_load_edj +** Description : +** Input : Evas_Object *parent +** const char *file +** const char *group +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Evas_Object *mf_main_load_edj(Evas_Object * parent, const char *file, const char *group) +{ + mf_debug(); + Evas_Object *eo; + int r; + + eo = elm_layout_add(parent); + elm_object_focus_set(eo, EINA_FALSE); + if (eo) { + r = elm_layout_file_set(eo, file, group); + if (!r) { + evas_object_del(eo); + return NULL; + } + + evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + } + + return eo; +} + +#ifdef MYFILE_MOTION_FEATURE +static void __mf_app_doubletap_cb(unsigned long long timestamp, void *data) +{ + MF_TRACE_BEGIN; + mf_widget_first_item_bring_in(data); +} +#endif + +/****************************** +** Prototype : __mf_main_del_win +** Description : +** Input : void *data +** Evas_Object *obj +** void *event +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_main_del_win(void *data, Evas_Object * obj, void *event) +{ + elm_exit(); +} + +/****************************** +** Prototype : __mf_main_create_win +** Description : +** Input : const char *name +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static Evas_Object *__mf_main_create_win(const char *name) +{ + mf_debug(); + Evas_Object *eo; + int w, h; + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + elm_object_focus_set(eo, EINA_FALSE); + elm_win_autodel_set(eo, 1); + if (eo) { + elm_win_title_set(eo, name); + evas_object_smart_callback_add(eo, "delete,request", __mf_main_del_win, NULL); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + evas_object_resize(eo, w, h); + } + if (eo) { + evas_object_show(eo); + return eo; + } else { + return NULL; + } +} + + +static Evas_Object *__mf_main_create_bg(Evas_Object *win) +{ + mf_retv_if(win == NULL, NULL); + Evas_Object *bg = elm_bg_add(win); + elm_object_focus_set(bg, EINA_FALSE); + + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_win_resize_object_add(win, bg); + + evas_object_show(bg); + + return bg; +} + + +/****************************** +** Prototype : __mf_main_capture_idle_img +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ + +static int __mf_main_check_path_vaild(const char *dir, int *dir_type) +{ + mf_retvm_if(dir == NULL, -1, "dir is NULL"); + mf_retvm_if(dir_type == NULL, -1, "state is NULL"); + + if (g_file_test(dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) + && strncmp(dir, ".", 1)) { + if (strncmp(dir, PHONE_FOLDER, strlen(PHONE_FOLDER)) == 0) { + *dir_type = MYFILE_PHONE; + } else if (strncmp(dir, MEMORY_FOLDER, strlen(MEMORY_FOLDER)) == 0) { + *dir_type = MYFILE_MMC; +#ifdef MYFILE_USB_OTG + } else if (strncmp(dir, OTG_FOLDER, strlen(OTG_FOLDER)) == 0){ + *dir_type = MYFILE_OTG; +#endif + }else { + *dir_type = MYFILE_NONE; + } + } else { + *dir_type = MYFILE_NONE; + } + return 0; +} + +static void __mf_main_bundle_parse(service_h service, void *data) +{ + MF_TRACE_BEGIN; + assert(data); + + struct appdata *ap = (struct appdata *)data; + + service_get_extra_data (service, "path", &ap->mf_Bundle.path); + service_get_extra_data (service, "select_type", &ap->mf_Bundle.select_type); + service_get_extra_data (service, "file_type", &ap->mf_Bundle.file_type); + service_get_extra_data (service, "marked_mode", &ap->mf_Bundle.marked_mode); + service_get_extra_data (service, "drm_type", &ap->mf_Bundle.drm_type); + MF_TRACE_END; +} + +static void __mf_main_view_create(void *data) +{ + MF_TRACE_BEGIN; + assert(data); + MF_TA_ACUM_ITEM_BEGIN(" mf_main_view_create", 0); + struct appdata *ap = (struct appdata *)data; + //MF_TA_ACUM_ITEM_END(" create_to_reset", 0); + + //create phone navibar struct + + MF_TA_ACUM_ITEM_BEGIN(" mf_widget_refresh_view", 0); + mf_widget_refresh_view(ap); + MF_TA_ACUM_ITEM_END(" mf_widget_refresh_view", 0); + MF_TA_ACUM_ITEM_END(" mf_main_view_create", 0); + +} + +Eina_Bool __mf_main_prop_change(void *data, int ev_type, void *ev) +{ + + MF_TRACE_BEGIN; + assert(data); + Ecore_X_Event_Window_Property *event = ev; + + if (event->win != ecore_x_window_root_first_get()) + return ECORE_CALLBACK_PASS_ON; + + if (event->atom != ecore_x_atom_get("FONT_TYPE_change")) { + return ECORE_CALLBACK_PASS_ON; + } + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool +__mf_main_app_init_idler_cb(void *data) +{ + MF_TRACE_BEGIN; + assert(data); + struct appdata *ap = (struct appdata *)data; + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_app_init_idler_cb", 0); + + + SAFE_FREE_ECORE_EVENT(ap->mf_MainWindow.font_event); + + ap->mf_MainWindow.font_event = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, + __mf_main_prop_change, + ap); + + SAFE_FREE_ECORE_EVENT(ap->mf_MainWindow.event); + ap->mf_MainWindow.event = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, + (Ecore_Event_Handler_Cb)mousedown_cb, ap); + + //MF_TA_ACUM_ITEM_BEGIN(" mmc callback set", 0); + mf_callback_set_mmc_state_cb(ap); + //MF_TA_ACUM_ITEM_END(" mmc callback set", 0); +#ifdef MYFILE_USB_OTG + //MF_TA_ACUM_ITEM_BEGIN(" otg callback set", 0); + mf_callback_set_otg_state_cb(ap); + //MF_TA_ACUM_ITEM_END(" otg callback set", 0); +#endif + ap->mf_Status.app_init_idler = NULL; + + if (mf_sbeam_init()) { + mf_sbeam_set_callback(mf_callback_sbeam_cb, ap); + } + +#ifdef MYFILE_MOTION_FEATURE + if(!mf_sensor_init()){ + if(!mf_sensor_set_callback(MF_MOTION_DOUBLETAP, __mf_app_doubletap_cb, ap)){ + mf_sensor_start(MF_MOTION_DOUBLETAP); + } + } + ap->mf_Status.doubletab_event_handler = mf_callback_motion_double_tap; +#endif + + MF_TA_ACUM_ITEM_END(" __mf_main_app_init_idler_cb", 0); + + return ECORE_CALLBACK_CANCEL; +} + +static int __mf_main_remake_app(service_h service, void *data) +{ + MF_TRACE_BEGIN; + assert(data); + MF_TA_ACUM_ITEM_BEGIN(" mf_main_remake_app", 0); + struct appdata *ap = (struct appdata *)data; + MF_TA_ACUM_ITEM_BEGIN(" check mass storage state", 0); + + /*if myfile state is not normal, it is not handled argument*/ + if (ap->mf_Status.more != MORE_DEFAULT) { + mf_warnig("Fail to handle budle, current myfiles stat is %d", ap->mf_Status.more); + goto RAISE_WIN; + } + MF_TA_ACUM_ITEM_END(" check mass storage state", 0); + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_view_create", 0); + + __mf_main_view_create(ap); + MF_TA_ACUM_ITEM_END(" __mf_main_view_create", 0); + +RAISE_WIN: + +/**************pre-condition test to launch myfile app******************/ + MF_TA_ACUM_ITEM_END(" mf_main_remake_app", 0); + + MF_TA_ACUM_ITEM_END(" Myfiles Launch Time", 0); + return 0; + +} + + +/* system operation callbacks */ +/****************************** +** Prototype : _keydown_event +** Description : +** Input : void *data +** int type +** void *event +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +#define TEMP_ENDKEY_ROLLBACK +#if 0 +static Eina_Bool __mf_main_keydown_event_callback(void *data, int type, void *event) +{ + Ecore_Event_Key *ev = event; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ev == NULL, ECORE_CALLBACK_RENEW, "Ecore_Event_Key is NULL"); + mf_retvm_if(ap == NULL, ECORE_CALLBACK_RENEW, "appdata is NULL"); + + if (!strcmp(ev->keyname, KEY_END)) { +#ifdef TEMP_ENDKEY_ROLLBACK + if (ap->mf_Status.more != MORE_DEFAULT) { + if (ap->mf_MainWindow.pProgressPopup != NULL) { + if (ap->mf_Status.more == MORE_DATA_COPYING + || ap->mf_Status.more == MORE_DATA_MOVING + || ap->mf_Status.more == MORE_DELETE || ap->mf_Status.more == MORE_IDLE_DELETE) { + mf_callback_progress_bar_cancel_cb(ap, NULL, NULL); + } + } + } + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + elm_exit(); +#else + mf_debug(); + if (ap->mf_SharedGadget.ug != NULL) { + mf_debug(); + ug_send_key_event(UG_KEY_EVENT_END); + } else { + if (ap->mf_MainWindow.pContextPopup != NULL) { + mf_debug(); + evas_object_del(ap->mf_MainWindow.pContextPopup); + ap->mf_MainWindow.pContextPopup = NULL; + } else { + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_debug(); + if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + elm_exit(); + } else { + mf_callback_upper_folder_cb(ap); + } + } else { + if (ap->mf_MainWindow.pNormalPopup == NULL) { + mf_callback_cancel_cb(ap, NULL, NULL); + } else { + if (ap->mf_Status.more == + MORE_DATA_COPYING + || ap->mf_Status.more == + MORE_DATA_MOVING || ap->mf_Status.more == MORE_DELETE || ap->mf_Status.more == MORE_IDLE_DELETE) { + mf_callback_progress_bar_cancel_cb(ap, NULL, NULL); + } + } + } + } + + } +#endif + } + return ECORE_CALLBACK_RENEW; +} +#endif +/****************************** +** Prototype : __mf_main_create_app +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_main_storage_status_get(void *data) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + int mmc_card = 0; + int error_code = 0; + + MF_TA_ACUM_ITEM_BEGIN(" storage check", 0); + error_code = mf_util_is_mmc_on(&mmc_card); + if (error_code == 0 && mmc_card == 1) { + ap->mf_Status.iStorageState |= MYFILE_MMC; + } + /*check if usb otg mounted */ +#ifdef MYFILE_USB_OTG + int otg = 0; + error_code = mf_util_is_otg_on(&otg); + mf_debug("error code is %d, org is %d", error_code, otg); + if (error_code == 0 && otg == 1) { + mf_debug(); + ap->mf_Status.iStorageState |= MYFILE_OTG; + } +#endif + MF_TA_ACUM_ITEM_END(" storage check", 0); +} + +bool __mf_main_create_app(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + int ret = 0; + + MF_TA_ACUM_ITEM_END(" main-to-create", 0); + + + MF_TA_ACUM_ITEM_BEGIN(" g_thread_init", 0); + if (!g_thread_supported()) { + g_thread_init(NULL); + } + MF_TA_ACUM_ITEM_END(" g_thread_init", 0); + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_create_app", 0); + + MF_TA_ACUM_ITEM_BEGIN(" mf_language_mgr_create", 0); + mf_language_mgr_create(); + MF_TA_ACUM_ITEM_END(" mf_language_mgr_create", 0); + + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_data_init", 0); + __mf_main_data_init(ap); + MF_TA_ACUM_ITEM_END(" __mf_main_data_init", 0); + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_create_win", 0); + + ap->mf_MainWindow.pWindow = __mf_main_create_win(PACKAGE); + mf_retvm_if(ap->mf_MainWindow.pWindow == NULL, -1, "Fail to __mf_main_create_win()"); + + evas_object_geometry_get(ap->mf_MainWindow.pWindow, NULL, NULL, &ap->mf_MainWindow.root_w, &ap->mf_MainWindow.root_h); + + MF_TA_ACUM_ITEM_END(" __mf_main_create_win", 0); + +#ifdef MYFILE_SPLIT_VIEW + if(mf_util_is_rotation_lock() == 0) { + mf_debug("rotation is locked"); + ap->mf_Status.rotation_type = MF_ROTATE_PORTRAIT; + ap->mf_Status.rotation_angle = 0; + } else { + app_device_orientation_e rotate_mode; + + rotate_mode = app_get_device_orientation(); + + mf_util_rotate_state_set(ap, rotate_mode); + } + + +#endif + + /**************start to launch myfile app******************/ + + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_create_bg", 0); + ap->mf_MainWindow.pBackGround = __mf_main_create_bg(ap->mf_MainWindow.pWindow); + MF_TA_ACUM_ITEM_END(" __mf_main_create_bg", 0); + + ap->mf_MainWindow.pConformant = mf_widget_create_conform(ap->mf_MainWindow.pWindow); + elm_win_resize_object_add(ap->mf_MainWindow.pWindow, ap->mf_MainWindow.pConformant); + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_create_layout_main", 0); + ap->mf_MainWindow.pMainLayout = mf_widget_create_layout_main(ap->mf_MainWindow.pConformant); + MF_TA_ACUM_ITEM_END(" __mf_main_create_layout_main", 0); + + elm_object_content_set(ap->mf_MainWindow.pConformant, ap->mf_MainWindow.pMainLayout); + elm_win_conformant_set(ap->mf_MainWindow.pWindow, EINA_TRUE); + elm_win_indicator_mode_set(ap->mf_MainWindow.pWindow, ELM_WIN_INDICATOR_SHOW); + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_storage_status_get", 0); + __mf_main_storage_status_get(ap); + MF_TA_ACUM_ITEM_END(" __mf_main_storage_status_get", 0); + + + MF_TA_ACUM_ITEM_BEGIN(" create phone naviframe struct", 0); + mf_widget_phone_storage_init(ap); + MF_TA_ACUM_ITEM_END(" create phone naviframe struct", 0); + + //create landscape/portrait view + MF_TA_ACUM_ITEM_BEGIN(" mf_widget_create", 0); + mf_widget_create(ap); + MF_TA_ACUM_ITEM_END(" mf_widget_create", 0); + + MF_TA_ACUM_ITEM_BEGIN(" set_view_to_mainlayout", 0); + + + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); +#ifdef MYFILE_SPLIT_VIEW + mf_widget_set_main_layout_content(ap); +#endif + MF_TA_ACUM_ITEM_END(" set_view_to_mainlayout", 0); + + + /*Create content frame of Main Layout*/ + MF_TA_ACUM_ITEM_BEGIN(" media_content_connect", 0); + ret = media_content_connect(); + mf_retvm_if(ret < 0, -1, "Fail to media_content_connect()"); + MF_TA_ACUM_ITEM_END(" media_content_connect", 0); + + + MF_TA_ACUM_ITEM_BEGIN(" mf_callback_create_dir_monitor", 0); + ret = mf_callback_create_dir_monitor(ap); + mf_retvm_if(ret < 0, -1, "Fail to mf_callback_create_dir_monitor()"); + MF_TA_ACUM_ITEM_END(" mf_callback_create_dir_monitor", 0); + + MF_TA_ACUM_ITEM_BEGIN(" app_init_idler", 0); + ap->mf_Status.app_init_idler = ecore_idler_add(__mf_main_app_init_idler_cb, ap); + MF_TA_ACUM_ITEM_END(" app_init_idler", 0); + + evas_object_smart_callback_add(ap->mf_MainWindow.pWindow, "profile,changed", mf_callback_profile_changed_cb, ap); + efreet_mime_init(); + __mf_main_remake_app(NULL, ap); + + MF_TA_ACUM_ITEM_END(" __mf_main_create_app", 0); + MF_TA_ACUM_ITEM_BEGIN(" create_to_reset", 0); + + MF_TRACE_END; + + ap->mf_Status.b_run_background = false; /* 20121008 added for fix PLM P121001-0404 temporary */ + + return true; +} + +static void __mf_main_reset_app(service_h service, void *data) +{ + MF_TRACE_BEGIN; + MF_TA_ACUM_ITEM_END(" create_to_reset", 0); + + + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_reset_app", 0); + struct appdata *ap = (struct appdata *)data; + char *operation = NULL; + + MF_TA_ACUM_ITEM_BEGIN(" service_get_operation", 0); + + service_get_operation(service, &operation); + MF_TA_ACUM_ITEM_END(" service_get_operation", 0); + + + if (g_strcmp0(operation, SERVICE_OPERATION_PICK) == 0) { + __mf_main_bundle_parse(service, ap); + /*launch myfile ug here*/ + ap->mf_SharedGadget.ug = mf_launch_load_ug_myfile(ap); + + service_clone(&ap->mf_Bundle.recv_service, service); + } else { + mf_debug(); + char *launch_type_str = NULL; + service_get_extra_data(service, "launch-type", &launch_type_str); + if(launch_type_str &&!strcasecmp(launch_type_str, "shortcut")) { + SAFE_FREE_CHAR(ap->mf_Bundle.path); + SAFE_FREE_CHAR(ap->mf_Bundle.select_type); + SAFE_FREE_CHAR(ap->mf_Bundle.file_type); + SAFE_FREE_CHAR(ap->mf_Bundle.marked_mode); + SAFE_FREE_CHAR(ap->mf_Bundle.drm_type); + ap->mf_Bundle.path = g_strdup(PHONE_FOLDER); + ap->mf_Bundle.select_type = g_strdup("SHORTCUT"); + ap->mf_SharedGadget.ug = mf_launch_load_ug_myfile(ap); + SAFE_FREE_CHAR(ap->mf_Bundle.path); + SAFE_FREE_CHAR(ap->mf_Bundle.select_type); + } else { + mf_debug(); + char *uri = NULL; + service_get_extra_data (service, "path", &uri); + mf_debug("======== uri is [%s]", uri); + if (uri && ecore_file_exists(uri)) { + MF_TA_ACUM_ITEM_BEGIN(" otg_launch", 0); + myfileNaviBar *pNavi_s_toshow = NULL; + myfileNaviBar *pNavi_s_inuse = NULL; + Evas_Object *pNaviBar = NULL; + ap->mf_Status.view_type = mf_view_normal; + pNavi_s_inuse = mf_navi_bar_get_in_use(ap); + if (pNavi_s_inuse == NULL || pNavi_s_inuse->pNaviLabel == NULL) { + MF_TRACE_END; + return; + } + + int locate = mf_fm_svc_wrapper_get_location(uri); + char *storage = NULL; + switch (locate) { + case MYFILE_PHONE: + storage = GET_SYS_STR(MF_LABEL_PHONE); + break; + case MYFILE_MMC: + storage = GET_SYS_STR(MF_LABEL_MMC); + break; + case MYFILE_OTG: + storage = GET_STR(MF_LABEL_OTG); + default: + break; + } + + + pNavi_s_inuse->naviFlagInUse = FALSE; + + pNaviBar = ap->mf_MainWindow.pNaviBar; + pNavi_s_toshow = mf_navi_bar_get_navi_from_navilist(ap->mf_MainWindow.plistNaviBar, storage); + + if (pNavi_s_toshow == NULL) { + /*2.0 get root path by storage label */ + char *rootpath = g_strdup(uri); + if (rootpath == NULL) { + MF_TRACE_END; + return; + } + /*2.1 create the navi for the tab */ + pNavi_s_toshow = malloc(sizeof(myfileNaviBar)); + if (pNavi_s_toshow == NULL) { + free(rootpath); + rootpath = NULL; + mf_debug("pNavi_s_toshow is NULL"); + MF_TRACE_END; + return; + } + memset(pNavi_s_toshow, 0, sizeof(myfileNaviBar)); + + pNavi_s_toshow->naviFlagInUse = TRUE; + /*2.2 set path as root path of the storage */ + pNavi_s_toshow->pCurrentPath = g_strdup(rootpath); + pNavi_s_toshow->pNaviLabel = g_strdup(storage); + free(rootpath); + /*2.3 insert phone navi into the navi_list */ + ap->mf_MainWindow.plistNaviBar = eina_list_append(ap->mf_MainWindow.plistNaviBar, pNavi_s_toshow); + + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = g_string_new(pNavi_s_toshow->pCurrentPath); + __mf_main_remake_app(service, ap); + MF_TRACE_END; + + } else { + mf_debug(); + /*2.1 get the navi of the tab */ + pNavi_s_toshow = mf_navi_bar_get_struct_by_label(ap, storage); + pNavi_s_toshow->naviFlagInUse = TRUE; + + /*2.2 set related status value. */ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = g_string_new(uri); + SAFE_FREE_CHAR(pNavi_s_toshow->pCurrentPath); + pNavi_s_toshow->pCurrentPath = g_strdup(uri); + mf_debug(); + /*2.3 update the content to catch update */ + /*Todo: How to ensure insert only once */ + __mf_main_remake_app(service, ap); + mf_debug(); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + MF_TRACE_END; + } + MF_TA_ACUM_ITEM_END(" otg_launch", 0); + + }else { + + /* 20121008 added for fix PLM P121001-0404 temporary { */ + if (ap->mf_MainWindow.pWindow != NULL && ap->mf_Status.b_run_background) + { + + elm_win_activate(ap->mf_MainWindow.pWindow); + ap->mf_Status.b_run_background = false; + MF_TRACE_END; + return; + } + } + } + } + + if (ap->mf_MainWindow.pWindow) { + evas_object_show(ap->mf_MainWindow.pWindow); + elm_win_activate(ap->mf_MainWindow.pWindow); + } + MF_TA_ACUM_ITEM_END(" __mf_main_reset_app", 0); + +} + +static void __mf_main_resume_app(void *data) +{ + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_resume_app", 0); + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); +#ifdef MYFILE_SPLIT_VIEW + struct appdata *ap = (struct appdata *)data; + if (!mf_util_is_rotation_lock()) { + ap->mf_Status.rotation_type = MF_ROTATE_PORTRAIT; + ap->mf_Status.rotation_angle = 0; + + mf_callback_app_rotate_cb(APP_DEVICE_ORIENTATION_0, ap); + + } else { + app_device_orientation_e mode = APP_DEVICE_ORIENTATION_0 ; + mode = app_get_device_orientation(); + if (mode != ap->mf_Status.rotation_type) + mf_callback_app_rotate_cb(mode, ap); + } + if (ap->mf_MainWindow.pWindow) { + evas_object_show(ap->mf_MainWindow.pWindow); + } +#endif + mf_sbeam_enable(); + MF_TA_ACUM_ITEM_END(" __mf_main_resume_app", 0); +} + +/****************************** +** Prototype : __mf_main_terminate_app +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void __mf_main_terminate_app(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + media_content_disconnect(); + efreet_mime_shutdown(); + + if (ap->mf_Status.search_handler) + mf_search_finalize(&ap->mf_Status.search_handler); + + mf_callback_destory_dir_monitor(ap); + + mf_ecore_idler_del(ap->mf_Status.app_init_idler); + mf_ecore_idler_del(ap->mf_Status.popup_del_idler); + mf_ecore_idler_del(ap->mf_Status.navi_content_idler); + SAFE_DEL_ECORE_TIMER(ap->mf_MainWindow.pPopupTimer); + SAFE_FREE_ECORE_EVENT(ap->mf_MainWindow.event); + SAFE_FREE_ECORE_EVENT(ap->mf_MainWindow.font_event); + +#ifdef MYFILE_MOTION_FEATURE + mf_sensor_finalize(); +#endif + + MF_TA_ACUM_ITEM_SHOW_RESULT_TO(MF_TA_SHOW_FILE); + MF_TA_RELEASE(); +#ifdef MYFILE_USB_OTG + mf_otg_finalize(ap); +#endif + +#ifdef MYFILE_CRITICAL_LOG + mf_log_finalize(); +#endif + mf_sbeam_finalize(); + +#ifdef MYFILE_SPLIT_VIEW + SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pPanes); +#endif + if (ap->mf_FileOperation.job_pop_list != NULL) { /*job callback must not run before*/ + mf_util_clear_handler_list(ap); + ap->mf_FileOperation.job_pop_list = NULL; + } + + if (ap->mf_FileOperation.job_push != NULL) { /*job callback must not run before*/ + ecore_job_del(ap->mf_FileOperation.job_push); + ap->mf_FileOperation.job_push = NULL; + } + + if (ap->mf_Status.flagIcuInit == TRUE) + mf_util_icu_finalize(ap); + + if (ap->mf_FileOperation.sync_pipe) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + mf_util_set_pm_lock(ap, EINA_FALSE); + mf_language_mgr_destroy(); +} + +/****************************** +** Prototype : __mf_main_stop_app +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void __mf_main_stop_app(void *data) +{ + MF_TA_ACUM_ITEM_BEGIN(" __mf_main_stop_app", 0); + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + /*check if phone navi is empty*/ + if (mf_launch_myfile_ug_exist(ap)) { + /*if myfile ug exists, delete the ug*/ + if (ap->mf_SharedGadget.ug != NULL) { + ug_destroy(ap->mf_SharedGadget.ug); + ap->mf_SharedGadget.ug = NULL; + } + + /*terminate the process*/ + elm_exit(); + } else { + if (ap->mf_SharedGadget.ug != NULL) { + ug_destroy(ap->mf_SharedGadget.ug); + ap->mf_SharedGadget.ug = NULL; + } + } + + mf_sbeam_disable(); + MF_TA_ACUM_ITEM_END(" __mf_main_stop_app", 0); + +} + +/****************************** +** Prototype : main +** Description : +** Input : int argc +** char *argv[] +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_language_changed_cb(void *user_data) +{ + mf_language_mgr_update(); +} + +int main(int argc, char *argv[]) +{ + app_event_callback_s ops; + struct appdata ad; + + MF_TA_INIT(); + MF_TA_ACUM_ITEM_BEGIN(" Myfiles Launch Time", 0); + MF_TA_ACUM_ITEM_BEGIN(" main", 0); + +#ifdef MYFILE_CRITICAL_LOG + int ret = mf_log_init(); + if (ret != MYFILE_ERR_NONE) + mf_debug("initialize critical log failed"); +#endif + + memset(&ops, 0x0, sizeof(app_event_callback_s)); + memset(&ad, 0x0, sizeof(struct appdata)); + + ops.create = __mf_main_create_app; + ops.terminate = __mf_main_terminate_app; + ops.pause = __mf_main_stop_app; + ops.resume = __mf_main_resume_app; + ops.service = __mf_main_reset_app; + ops.device_orientation = mf_callback_app_rotate_cb; + ops.region_format_changed = mf_callback_icu_update_cb; + ops.language_changed = __mf_language_changed_cb; + + MF_TA_ACUM_ITEM_END(" main", 0); + MF_TA_ACUM_ITEM_BEGIN(" main-to-create", 0); + return app_efl_main(&argc, &argv, &ops, &ad); +} diff --git a/src/widget/mf-content.c b/src/widget/mf-content.c new file mode 100644 index 0000000..c798497 --- /dev/null +++ b/src/widget/mf-content.c @@ -0,0 +1,68 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include "mf-widget.h" +#include "mf-util.h" +#include "mf-fm-svc-wrapper.h" +/***Todo we need to extract some common code to be APIs***/ +/****************************** +** Prototype : mf_content_create_list +** Description : create the list for the content +** Input : struct appdata *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Evas_Object *mf_content_create_list(struct appdata *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "invalid parameter data"); + + + if (ap->mf_MainWindow.pNaviGenlist) + ap->mf_MainWindow.pNaviGenlist = NULL; + + return mf_navi_bar_content_create(ap); +} + +/****************************** +** Prototype : mf_content_main_layout_set_by_tab_item_count +** Description : set content of mainlayout by the count of tab bar items +** Input : void *data +** Output : None +** Return Value : 0 tab is deleted and navibar of phone set as content + : 1 tab bar is the content +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ + + diff --git a/src/widget/mf-context-popup.c b/src/widget/mf-context-popup.c new file mode 100644 index 0000000..743b778 --- /dev/null +++ b/src/widget/mf-context-popup.c @@ -0,0 +1,343 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "mf-widget.h" +#include "mf-callback.h" +#include "mf-share.h" +#include "mf-language-mgr.h" + + +static Evas_Coord touch_x; +static Evas_Coord touch_y; + + +/****************************** +** Prototype : _move_ctxpopup +** Description : move the context popup to the suitable location +** Input : void *data +** Evas_Object *ctxpopup +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void _move_ctxpopup(void *data, Evas_Object *parent, Evas_Object *ctxpopup ) +{ + struct appdata* ap = (struct appdata *)data; + elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP, + ELM_CTXPOPUP_DIRECTION_LEFT, + ELM_CTXPOPUP_DIRECTION_RIGHT, + ELM_CTXPOPUP_DIRECTION_DOWN); + + + if (parent) { + int x = 0; + int y = 0; + int w = 0; + int h = 0; + + evas_object_geometry_get(parent, &x, &y, &w, &h); + evas_object_move(ctxpopup, x + (w / 2), y + (h /2)); + } else { + evas_object_move(ctxpopup, touch_x, touch_y); + } +} + + +/****************************** +** Prototype : mousedown_cb +** Description : callback function for the mouse down operation in context + popup +** Input : void *data +** int type +** void *event +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_context_popup_get_position(Evas_Object *obj, const char *label, int *x, int *y) +{ + mf_retm_if(obj == NULL, "obj is NULL"); + mf_retm_if(label == NULL, "label is NULL"); + Evas_Object *pCtrlBar = obj; + + Elm_Object_Item *pItem = NULL; + int x_position = 0; + int y_position = 0; + int w = 0; + + pItem = elm_toolbar_first_item_get(pCtrlBar); + + while(pItem) { + const char *button_label = elm_object_item_text_get(pItem); + if (g_strcmp0(button_label, label) == 0) { + Evas_Object *icon = elm_toolbar_item_object_get(pItem); + evas_object_geometry_get(icon, &x_position, &y_position, &w, NULL); + *x = x_position+w/2; + *y = y_position; + return; + } + pItem = elm_toolbar_item_next_get(pItem); + } +} + +int mousedown_cb( void *data, int type, void *event ) +{ + struct appdata* ap = (struct appdata *)data; + Evas_Coord x = 0; + Evas_Coord y = 0; + Evas_Coord w = 0; + Elm_Object_Item *navi_it = ap->mf_MainWindow.pNaviItem; + + + if (ap->mf_Status.navi_item_selected == MF_NAVI_BTN_MORE) { + Evas_Object *button = elm_object_item_part_content_get(navi_it, NAVI_MORE_BUTTON_PART); + evas_object_geometry_get(button, &x, &y, &w, NULL); + touch_x = x+w/2;; + touch_y = y; + return 0; + } else if (ap->mf_Status.more == MF_NAVI_BTN_SHARE) { + Evas_Object *button = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_2_PART); + + mf_context_popup_get_position(button, GET_SYS_STR(LABEL_SHARE),&x, &y); + mf_debug("x is [%d] y is [%d]", x, y); + touch_x = x; + touch_y = y; + return 0; + } else { + return 0; + } +} + +/****************************** +** Prototype : mfContextPopupCreate +** Description : Create the context popup +** Input : void *data +** eContextPopMode popupMode +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void _ctxpopup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(obj == NULL, "obj is NULL"); + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTXPOP); + evas_object_del(obj); + obj = NULL; + MF_TRACE_END; +} + +void mf_context_popup_create_gengrid(void *data) +{ + mf_retm_if(data == NULL, "data is NULL"); + mfItemData_s *itemData = (mfItemData_s *)data; + struct appdata* ap = (struct appdata *)itemData->ap; + mf_retm_if(ap == NULL, "ap is NULL"); + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + + if (ap->mf_Status.more == MORE_DEFAULT) { + Evas_Object *ctxpopup = elm_ctxpopup_add(ap->mf_MainWindow.pNaviBar); + ap->mf_MainWindow.pContextPopup = ctxpopup; + Elm_Object_Item *it = NULL; + Evas_Object *parent = elm_object_item_part_content_get(itemData->item, "elm.swallow.icon"); + + if (ap->mf_Status.view_type == mf_view_root) { + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_DETAIL), NULL, mf_callback_detail_ctx_cb, itemData); + mf_language_mgr_register_object_item(it, LABEL_DETAIL, ITEM_TYPE_CTXPOP); + } else { + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_RENAME), NULL, mf_callback_rename_create_cb, itemData); + mf_language_mgr_register_object_item(it, LABEL_RENAME, ITEM_TYPE_CTXPOP); + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_DELETE), NULL, mf_callback_delete_button_cb, itemData); + mf_language_mgr_register_object_item(it, LABEL_DELETE, ITEM_TYPE_CTXPOP); + + } + _move_ctxpopup(ap, parent, ctxpopup); + evas_object_show(ctxpopup); + + if(ctxpopup) + { + evas_object_smart_callback_add(ctxpopup,"dismissed", _ctxpopup_hide_cb, ap); + } + } +} + + +void mf_context_popup_create_more(void *data, Evas_Object *parent) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata* ap = (struct appdata *)data; + int extension_state = ap->mf_Status.iExtensionState; + + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + Evas_Object *ctxpopup = elm_ctxpopup_add(ap->mf_MainWindow.pNaviBar); + ap->mf_MainWindow.pContextPopup = ctxpopup; + Elm_Object_Item *it = NULL; + + if (ap->mf_Status.more == MORE_DEFAULT) { + /*Search*/ + if (ap->mf_Status.view_type == mf_view_root) { + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_VIEW_AS), NULL, mf_callback_view_as_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_VIEW_AS, ITEM_TYPE_CTXPOP); + + /*Sort by*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_SORT_BY), NULL, mf_callback_list_by_view_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_SORT_BY, ITEM_TYPE_CTXPOP); + } else if (ap->mf_Status.view_type == mf_view_root_category) { + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_SEARCH), NULL,mf_search_bar_enter_search_routine, ap); + mf_language_mgr_register_object_item(it, LABEL_SEARCH, ITEM_TYPE_CTXPOP); + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_VIEW_AS), NULL, mf_callback_view_as_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_VIEW_AS, ITEM_TYPE_CTXPOP); + + /*Sort by*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_SORT_BY), NULL, mf_callback_list_by_view_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_SORT_BY, ITEM_TYPE_CTXPOP); + if (extension_state == MF_EXTENSION_SHOW) { + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(MF_LABEL_HIDE_EXTENSION), NULL, mf_callback_extension_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_HIDE_EXTENSION, ITEM_TYPE_CTXPOP); + } else { + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(MF_LABEL_SHOW_EXTENSION), NULL, mf_callback_extension_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_SHOW_EXTENSION, ITEM_TYPE_CTXPOP); + } + } + else { + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_SEARCH), NULL,mf_search_bar_enter_search_routine, ap); + mf_language_mgr_register_object_item(it, LABEL_SEARCH, ITEM_TYPE_CTXPOP); + + /*Create folder*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(MF_LABEL_CREATE_FOLDER), NULL,mf_callback_new_folder_create_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_CREATE_FOLDER, ITEM_TYPE_CTXPOP); + + /*View as*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_VIEW_AS), NULL, mf_callback_view_as_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_VIEW_AS, ITEM_TYPE_CTXPOP); + + /*Sort by*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(LABEL_SORT_BY), NULL, mf_callback_list_by_view_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_SORT_BY, ITEM_TYPE_CTXPOP); + + /*Extension*/ + if (extension_state == MF_EXTENSION_SHOW) { + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(MF_LABEL_HIDE_EXTENSION), NULL, mf_callback_extension_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_HIDE_EXTENSION, ITEM_TYPE_CTXPOP); + } else { + it = elm_ctxpopup_item_append(ctxpopup, GET_STR(MF_LABEL_SHOW_EXTENSION), NULL, mf_callback_extension_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_SHOW_EXTENSION, ITEM_TYPE_CTXPOP); + } + } + } else if(ap->mf_Status.more == MORE_EDIT) { + /*Copy*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_COPY), NULL, mf_callback_copy_move_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_COPY, ITEM_TYPE_CTXPOP); + /*Move*/ + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(LABEL_MOVE), NULL,mf_callback_copy_move_cb, ap); + mf_language_mgr_register_object_item(it, LABEL_MOVE, ITEM_TYPE_CTXPOP); + + } else if(ap->mf_Status.more == MORE_INTERNAL_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY) { + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(MF_LABEL_CREATE_FOLDER), NULL,mf_callback_new_folder_create_cb, ap); + mf_language_mgr_register_object_item(it, MF_LABEL_CREATE_FOLDER, ITEM_TYPE_CTXPOP); + } + _move_ctxpopup(ap, parent, ctxpopup); + evas_object_show(ctxpopup); + + if(ctxpopup) + { + evas_object_smart_callback_add(ctxpopup,"dismissed", _ctxpopup_hide_cb, ap); + } +} + + +static void __mf_share_select(void *data, Evas_Object * obj, void *event_info) +{ + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(event_info == NULL, "event_info is NULL"); + + struct appdata* ap = (struct appdata *)data; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + const char *label = NULL; + label = elm_object_item_text_get(item); + ap->mf_Status.preMore = MORE_SHARE_EDIT; + if (g_strcmp0(label, GET_SYS_STR(MF_POP_MSG_BT)) == 0) { + ap->mf_Status.more = MORE_SENDVIABLUETOOTH; + } else if (g_strcmp0(label, GET_SYS_STR(MF_POP_MSG_EMAIL)) == 0) { + ap->mf_Status.more = MORE_SENDVIAEMAIL; + + } else if (g_strcmp0(label, GET_SYS_STR(MF_POP_MSG_MESSAGE)) == 0) { + ap->mf_Status.more = MORE_SENDVIAMESSAGE; + } + + mf_callback_send_response_cb(ap); + } +} + +void mf_context_popup_create_share(void *data, int share_mode, Evas_Object *parent) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata* ap = (struct appdata *)data; + + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + ap->mf_Status.navi_item_selected = MF_NAVI_BTN_SHARE; + + Evas_Object *ctxpopup = elm_ctxpopup_add(ap->mf_MainWindow.pNaviBar); + ap->mf_MainWindow.pContextPopup = ctxpopup; + Elm_Object_Item *it = NULL; + + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(MF_POP_MSG_MESSAGE), NULL, __mf_share_select, ap); + mf_language_mgr_register_object_item(it, MF_POP_MSG_MESSAGE, ITEM_TYPE_CTXPOP); + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(MF_POP_MSG_EMAIL), NULL, __mf_share_select, ap); + mf_language_mgr_register_object_item(it, MF_POP_MSG_EMAIL, ITEM_TYPE_CTXPOP); + it = elm_ctxpopup_item_append(ctxpopup, GET_SYS_STR(MF_POP_MSG_BT), NULL, __mf_share_select, ap); + mf_language_mgr_register_object_item(it, MF_POP_MSG_BT, ITEM_TYPE_CTXPOP); + + + + _move_ctxpopup(ap, parent,ctxpopup); + evas_object_show(ctxpopup); + + if(ctxpopup) + { + evas_object_smart_callback_add(ctxpopup,"dismissed", _ctxpopup_hide_cb, ap); + } +} + diff --git a/src/widget/mf-ctrl-bar.c b/src/widget/mf-ctrl-bar.c new file mode 100644 index 0000000..dc929fa --- /dev/null +++ b/src/widget/mf-ctrl-bar.c @@ -0,0 +1,593 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include +#include "mf-util.h" +#include "mf-widget.h" +#include "mf-callback.h" +#include "mf-resource.h" +#include "mf-language-mgr.h" + +/****************************** +** Prototype : __mf_ctrl_bar_create_ctrl_bar +** Description : Samsung +** Input : Evas_Object *parent +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static Evas_Object *__mf_ctrl_bar_create_ctrl_bar(Evas_Object * parent) +{ + Evas_Object *pCtrlBar = NULL; + + if (parent == NULL) { + return NULL; + } + + pCtrlBar = elm_toolbar_add(parent); + elm_toolbar_shrink_mode_set(pCtrlBar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_style_set(pCtrlBar, "naviframe"); + evas_object_show(pCtrlBar); + return pCtrlBar; +} + +/****************************** +** Prototype : __mf_ctrl_bar_set_label_list +** Description : Samsung +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static Eina_List *__mf_ctrl_bar_set_label_list(void *data) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, false, "ap is NULL"); + Eina_List *pLabelList = NULL; + + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + pLabelList = eina_list_append(pLabelList, MF_LABEL_EDIT); + pLabelList = eina_list_append(pLabelList, LABEL_SORT_BY); + pLabelList = eina_list_append(pLabelList, LABEL_SEARCH); + pLabelList = eina_list_append(pLabelList, MF_LABEL_MORE); + break; + case MORE_EDIT: + pLabelList = eina_list_append(pLabelList, LABEL_DELETE); + pLabelList = eina_list_append(pLabelList, LABEL_SHARE); + pLabelList = eina_list_append(pLabelList, LABEL_MOVE); + pLabelList = eina_list_append(pLabelList, LABEL_COPY); + pLabelList = eina_list_append(pLabelList, LABEL_CANCEL); + break; + case MORE_CREATE_FOLDER: + case MORE_THUMBNAIL_RENAME: + case MORE_RENAME: + pLabelList = eina_list_append(pLabelList, LABEL_SAVE); + pLabelList = eina_list_append(pLabelList, LABEL_CANCEL); + break; + case MORE_INTERNAL_COPY: + case MORE_DATA_COPYING: + pLabelList = eina_list_append(pLabelList, LABEL_COPY_HERE); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, MF_LABEL_CREATE_FOLDER); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, LABEL_CANCEL); + break; + case MORE_INTERNAL_MOVE: + case MORE_DATA_MOVING: + pLabelList = eina_list_append(pLabelList, LABEL_MOVE_HERE); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, MF_LABEL_CREATE_FOLDER); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, LABEL_CANCEL); + break; + case MORE_INTERNAL_COPY_MOVE: + pLabelList = eina_list_append(pLabelList, LABEL_CANCEL); + pLabelList = eina_list_append(pLabelList, LABEL_MOVE_HERE); + pLabelList = eina_list_append(pLabelList, LABEL_COPY_HERE); + pLabelList = eina_list_append(pLabelList, MF_LABEL_CREATE_FOLDER); + break; + default: + return NULL; + } + return pLabelList; +} + + + + +/****************************** +** Prototype : __mf_ctrl_bar_set_label +** Description : Samsung +** Input : void *data +** Eina_List **label_list +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_ctrl_bar_set_label(void *data, Eina_List ** label_list) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (label_list != NULL) { + if (*label_list != NULL) { + eina_list_free(*label_list); + //mf_util_free_eina_list_with_data(label_list, MYFILE_TYPE_CHAR); + *label_list = NULL; + } + } else { + return; + } + *label_list = __mf_ctrl_bar_set_label_list(ap); +} + + +static Eina_List *__mf_ctrl_bar_set_icon_list(void *data) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, false, "ap is NULL"); + Eina_List *pLabelList = NULL; + + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_EDIT)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_LIST_BY)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_SEARCH)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_NEW_FOLDER_CREATE)); + break; + case MORE_EDIT: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_DELETE)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_SEND)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_MOVE)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_COPY)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_CANCEL)); + break; + case MORE_CREATE_FOLDER: + case MORE_THUMBNAIL_RENAME: + case MORE_RENAME: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_SAVE)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_CANCEL)); + break; + case MORE_INTERNAL_COPY: + case MORE_DATA_COPYING: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_PASTE_HERE)); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_NEW_FOLDER_CREATE)); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_CANCEL)); + break; + case MORE_INTERNAL_MOVE: + case MORE_DATA_MOVING: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_MOVE_HERE)); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_NEW_FOLDER_CREATE)); + pLabelList = eina_list_append(pLabelList, NULL); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_CANCEL)); + break; + case MORE_INTERNAL_COPY_MOVE: + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_CANCEL)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_MOVE)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_COPY)); + pLabelList = eina_list_append(pLabelList, strdup(MF_CTRL_ICON_NEW_FOLDER_CREATE)); + break; + default: + return NULL; + } + return pLabelList; +} + + +static void __mf_ctrl_bar_set_icon(void *data, Eina_List ** label_list) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (label_list != NULL) { + if (*label_list != NULL) { + mf_util_free_eina_list_with_data(label_list, MYFILE_TYPE_CHAR); + *label_list = NULL; + } + } else { + return; + } + *label_list = __mf_ctrl_bar_set_icon_list(ap); +} + + +static Eina_List *__mf_ctrl_bar_set_callback_list(void *data) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + Eina_List *pCallBackList = NULL; + + switch (ap->mf_Status.more) { + case MORE_DEFAULT: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_edit_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_list_by_view_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_search_bar_enter_search_routine); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_more_button_cb); + break; + case MORE_INTERNAL_COPY_MOVE: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_move_here_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_paste_here_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_new_folder_create_cb); + break; + case MORE_INTERNAL_COPY: + case MORE_DATA_COPYING: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_paste_here_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) NULL); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_new_folder_create_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) NULL); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + break; + case MORE_INTERNAL_MOVE: + case MORE_DATA_MOVING: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_move_here_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) NULL); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_new_folder_create_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) NULL); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + break; + case MORE_EDIT: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_delete_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_share_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_copy_move_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_copy_move_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + /*pCallBackList = eina_list_append(pCallBackList, (mfCallBack)mfCopyCB);*/ + /*pCallBackList = eina_list_append(pCallBackList, (mfCallBack)mfMoveCB);*/ + break; + case MORE_RENAME: + case MORE_THUMBNAIL_RENAME: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_rename_save_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + break; + case MORE_CREATE_FOLDER: + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_save_cb); + pCallBackList = eina_list_append(pCallBackList, (mfCallBack) mf_callback_cancel_cb); + default: + break; + } + return pCallBackList; +} + +/****************************** +** Prototype : __mf_ctrl_bar_set_callback +** Description : Samsung +** Input : void *data +** Eina_List **callback_list +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_ctrl_bar_set_callback(void *data, Eina_List ** callback_list) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (callback_list != NULL) { + if (*callback_list != NULL) { + eina_list_free(*callback_list); + *callback_list = NULL; + } + } else { + return; + } + *callback_list = __mf_ctrl_bar_set_callback_list(ap); +} + + + +/****************************** +** Prototype : __mf_ctrl_bar_add_item +** Description : Samsung +** Input : void *data +** Evas_Object *ctrl_bar +** Eina_List *label_list +** Eina_List *callback_list +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static bool __mf_ctrl_bar_add_item(void *data, Evas_Object * ctrl_bar, Eina_List * label_list, Eina_List * callback_list, Eina_List * button_list) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, false, "ap is NULL"); + + Evas_Object *pCtrlBar = ctrl_bar; + + Eina_List *callback = callback_list; + int label_count = 0; + mfCallBack fun = NULL; + int callback_count = 0; + int index = 0; + + label_count = eina_list_count(label_list); + callback_count = eina_list_count(callback_list); + +/* + if(label_count ==0 || callback_count == 0 || label_count != callback_count) + { + return false; + } + else*/ + + Elm_Object_Item *pItem = NULL; + Elm_Object_Item *pNext = NULL; + + pItem = elm_toolbar_first_item_get(pCtrlBar); + + while(pItem) { + pNext = elm_toolbar_item_next_get(pItem); + mf_language_mgr_unregister_object_item(pItem); + elm_object_item_del(pItem); + pItem = pNext; + } + + for (index = 0; index < callback_count; index++) { + char *lable = NULL; + char *icon = NULL; + fun = (mfCallBack) eina_list_nth(callback, index); + lable = eina_list_nth(label_list, index); + icon = eina_list_nth(button_list, index); + Elm_Object_Item *it = elm_toolbar_item_append(pCtrlBar, NULL, mf_util_get_text(lable), fun, ap); + if (lable == NULL) { + elm_object_item_disabled_set(it, EINA_TRUE); + } + mf_language_mgr_register_object_item(it, lable, ITEM_TYPE_CTRL); + } + return true; +} + +/****************************** +** Prototype : mf_ctrl_bar_create +** Description : Samsung +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_ctrl_bar_del_item(Evas_Object *pCtrlBar) +{ + mf_retm_if(pCtrlBar == NULL, "pCtrlBar is NULL"); + + + Elm_Object_Item *pItem = NULL; + Elm_Object_Item *pNext = NULL; + pItem = elm_toolbar_first_item_get(pCtrlBar); + + while(pItem) { + printf("deleting item is [%s]\n", elm_object_item_text_get(pItem)); + pNext = elm_toolbar_item_next_get(pItem); + mf_language_mgr_unregister_object_item(pItem); + elm_object_item_del(pItem); + pItem = pNext; + } + +} + +void mf_ctrl_bar_reset(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + Evas_Object *pCtrlBar = NULL; + Eina_List *label_list = NULL; + Eina_List *button_list = NULL; + Eina_List *callback_list = NULL; + + if (ap->mf_MainWindow.pNaviCtrlBar) { + __mf_ctrl_bar_del_item(ap->mf_MainWindow.pNaviCtrlBar); + } + + pCtrlBar = ap->mf_MainWindow.pNaviCtrlBar; + + __mf_ctrl_bar_set_label(ap, &label_list); + __mf_ctrl_bar_set_icon(ap, &button_list); + __mf_ctrl_bar_set_callback(ap, &callback_list); + + __mf_ctrl_bar_add_item(ap, pCtrlBar, label_list, callback_list, button_list); + + eina_list_free(callback_list); + //mf_util_free_eina_list_with_data(&label_list, MYFILE_TYPE_CHAR); + eina_list_free(callback_list); + + evas_object_show(pCtrlBar); + + MF_TRACE_END; +} + +Evas_Object *mf_ctrl_bar_create(void *data, Evas_Object *parent) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + Evas_Object *pCtrlBar = NULL; + Eina_List *label_list = NULL; + Eina_List *button_list = NULL; + Eina_List *callback_list = NULL; + + pCtrlBar = __mf_ctrl_bar_create_ctrl_bar(parent); + mf_retvm_if(pCtrlBar == NULL, NULL, "pCtrlBar is NULL"); + + __mf_ctrl_bar_set_label(ap, &label_list); + __mf_ctrl_bar_set_icon(ap, &button_list); + __mf_ctrl_bar_set_callback(ap, &callback_list); + + __mf_ctrl_bar_add_item(ap, pCtrlBar, label_list, callback_list, button_list); + + //mf_util_free_eina_list_with_data(&label_list, MYFILE_TYPE_CHAR); + eina_list_free(label_list); + eina_list_free(callback_list); + MF_TRACE_END; + return pCtrlBar; +} + + +/****************************** +** Prototype : mf_ctrl_bar_item_set_disable +** Description : function for the Disable set of the Control Bar +** Input : Evas_Object *ctrl_bar +** int disable_item +** bool disable +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_ctrl_bar_item_set_disable(Evas_Object *ctrl_bar, int disable_item, bool disable) +{ + mf_debug(); + Evas_Object *pCtrlBar = ctrl_bar; + + Elm_Object_Item *it = NULL; + it = elm_toolbar_first_item_get(pCtrlBar); + + while(it) { + + const char *button_label = elm_object_item_text_get(it); + + if ((disable_item & CTRL_DISABLE_COPY) && g_strcmp0(button_label, GET_SYS_STR(LABEL_COPY)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_MOVE) && g_strcmp0(button_label, GET_SYS_STR(LABEL_MOVE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_DELETE) + && g_strcmp0(button_label, GET_SYS_STR(LABEL_DELETE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_SEARCH) && g_strcmp0(button_label, GET_SYS_STR(LABEL_SEARCH)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_SEND) && g_strcmp0(button_label, GET_SYS_STR(LABEL_SHARE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_LIST_BY) && g_strcmp0(button_label, GET_STR(LABEL_SORT_BY)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_CREATE) && g_strcmp0(button_label, GET_SYS_STR(MF_LABEL_CREATE_FOLDER)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_EDIT) && g_strcmp0(button_label, GET_SYS_STR(MF_LABEL_EDIT)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_CANCEL) && g_strcmp0(button_label, GET_SYS_STR(LABEL_CANCEL)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_COPY_HERE) && g_strcmp0(button_label, GET_STR(LABEL_COPY_HERE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_MOVE_HERE) && g_strcmp0(button_label, GET_STR(LABEL_MOVE_HERE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + } else if ((disable_item & CTRL_DISABLE_MORE) && g_strcmp0(button_label, GET_SYS_STR(MF_LABEL_MORE)) == 0) { + mf_debug(); + elm_object_item_disabled_set(it, disable); + + } + it = elm_toolbar_item_next_get(it); + } + +} + +int mf_ctrl_bar_item_get_disable(Evas_Object *ctrl_bar) +{ + Evas_Object *pCtrlBar = ctrl_bar; + + int disable_item = 0; + + Elm_Object_Item *pItem = NULL; + pItem = elm_toolbar_first_item_get(pCtrlBar); + + while(pItem) { + if (elm_object_item_disabled_get(pItem)) { + const char *button_label = elm_object_item_text_get(pItem); + + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_DELETE)) == 0) { + disable_item |= CTRL_DISABLE_DELETE; + } else if (g_strcmp0(button_label, GET_SYS_STR(LABEL_SHARE)) == 0) { + disable_item |= CTRL_DISABLE_SEND; + } else if (g_strcmp0(button_label, GET_SYS_STR(LABEL_COPY)) == 0) { + disable_item |= CTRL_DISABLE_COPY; + } else if (g_strcmp0(button_label, GET_SYS_STR(LABEL_MOVE)) == 0) { + disable_item |= CTRL_DISABLE_MOVE; + } + } + pItem = elm_toolbar_item_next_get(pItem); + } + + return disable_item; +} + diff --git a/src/widget/mf-gengrid.c b/src/widget/mf-gengrid.c new file mode 100644 index 0000000..3291099 --- /dev/null +++ b/src/widget/mf-gengrid.c @@ -0,0 +1,626 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include "mf-widget.h" +#include "mf-util.h" +#include "mf-callback.h" +#include "mf-launch.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-otg.h" +#include "mf-language-mgr.h" + +Elm_Gengrid_Item_Class gic; +#define GENGRID_ITEM_WIDTH 72 + +static inline void __mf_gengrid_get_thumbnail(mfItemData_s *params) +{ + int error_code = 0; + if (params->thumb_path == NULL) { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + if (params->ap->mf_Status.view_type == mf_view_root) { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_FOLDER); + } else if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) { + params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE); + } else { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_FOLDER); + } + params->real_thumb_flag = TRUE; + } else { + const char *icon_path = NULL; + mf_file_attr_get_file_icon(params->m_ItemName->str, &error_code, MF_ROTATE_LANDSCAPE, &icon_path, ¶ms->media); + if (icon_path && ecore_file_exists(icon_path)) { + if (!g_strcmp0(icon_path, DEFAULT_ICON)) { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_UNKOWN); + } else { + params->thumb_path = strdup(icon_path); + } + params->real_thumb_flag = TRUE; + } else { /*must be image/video file*/ + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + + if (type == FILE_TYPE_VIDEO) { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_VIDEO); + } else if (type == FILE_TYPE_IMAGE) { + params->thumb_path = strdup(MF_ICON_IMAGE); + } else { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_UNKOWN); + } + params->real_thumb_flag = FALSE; + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + } + } else if (params->thumb_path && ecore_file_exists(params->thumb_path)) { + if (params->real_thumb_flag == FALSE) { + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + } else if (!ecore_file_exists(params->thumb_path)) { + mf_error("thumb_path[%s] is not exist", params->thumb_path); + free(params->thumb_path); + params->thumb_path = NULL; + /*set default icon*/ + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) { + params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE); + } else { + params->thumb_path = strdup(MF_ICON_FOLDER); + } + + } else { + if (type == FILE_TYPE_VIDEO) { + params->thumb_path = strdup(MF_ICON_THUMBNAIL_VIDEO); + } else if (type == FILE_TYPE_IMAGE) { + params->thumb_path = strdup(MF_ICON_IMAGE); + } else { + params->thumb_path = strdup(DEFAULT_ICON); + } + } + params->real_thumb_flag = FALSE; + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + if (error_code != 0) { + mf_callback_create_thumbnail(params, mf_callback_thumb_created_cb); + } +} + +static void __mf_gengrid_icon_clicked(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(event_info == NULL, "event_info is NULL"); + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + int ret = 0; + + if (ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT) + return; + if (item != NULL) { + elm_gengrid_item_selected_set(item, EINA_FALSE); + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + mf_retm_if(selected == NULL, "selected is NULL"); + mf_retm_if(selected->m_ItemName == NULL, "selected->m_ItemName is NULL"); + mf_retm_if(selected->m_ItemName->str == NULL, "selected->m_ItemName->str is NULL"); + if (mf_fm_svc_wrapper_is_dir(selected->m_ItemName)) { + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + GString *new_path = NULL; + int error_code = 0; + bool result = FALSE; + + if (ap->mf_Status.more == MORE_SEARCH) + ap->mf_Status.more = MORE_DEFAULT; + + + new_path = g_string_new(selected->m_ItemName->str); + +#ifdef MYFILE_USB_OTG + /* if click items under otg root path, it means some disk take into use*/ + error_code = mf_file_attr_is_disk_link(new_path->str, &result); + if (error_code == 0 && result == TRUE) { /* a usb disk take into use */ + /* + **we don't need to set the previous device flag to be false + **because click cannot jump from one device to another + */ + mf_otg_set_node_using_flag(ap, new_path->str,TRUE); + } +#endif + /*set new path */ + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = new_path; + + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(new_path->str); + + if (ap->mf_Status.view_type == mf_view_root) { + ap->mf_Status.view_type = mf_view_normal; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) { + mf_navi_bar_reset_panes_main(ap); + } + } +#endif + } + mf_widget_refresh_view(ap); + } else { + ret = mf_launch_service(ap, selected->m_ItemName->str); + } + } + MF_TRACE_END; +} +static void __mf_gengrid_item_check_changed(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + + mfItemData_s *itemData = (mfItemData_s *)data; + struct appdata *ap = (struct appdata *)itemData->ap; + + itemData->m_checked = elm_check_state_get(obj); + if (itemData->m_checked) { + ap->mf_MainWindow.pEditView.iCheckedCount++; + } else { + ap->mf_MainWindow.pEditView.iCheckedCount--; + } + + //if (ap->mf_MainWindow.pEditView.pSelectAllCheckBox) { + + if (ap->mf_MainWindow.pEditView.iTotalCount == ap->mf_MainWindow.pEditView.iCheckedCount) { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_TRUE; + } else { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_FALSE; + } + //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked); + //} + + elm_gengrid_item_selected_set(itemData->item, itemData->m_checked); + mf_genlist_gl_edit_item_selected(ap); + MF_TRACE_END; +} + +void mf_gengrid_select_all(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + Evas_Object *gengrid = ap->mf_MainWindow.pEditView.pGengrid; + mfItemData_s *it_data = NULL; + Elm_Object_Item *it = NULL; + + it = elm_gengrid_first_item_get(gengrid); + while (it) { + it_data = elm_object_item_data_get(it); + if (it_data) { + if (it_data->ap->mf_Status.more == MORE_SHARE_EDIT) { + if (mf_file_attr_is_dir(it_data->m_ItemName->str)) { + it = elm_genlist_item_next_get(it); + continue; + } + } + it_data->m_checked = ap->mf_MainWindow.pEditView.bSelectAllChecked; + elm_check_state_set(it_data->pCheckBox, it_data->m_checked); + elm_gengrid_item_selected_set(it_data->item, it_data->m_checked); + } + it = elm_gengrid_item_next_get(it); + } + +} + +void mf_gengrid_edit_select(void *data, int *count) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + Evas_Object *gengrid = ap->mf_MainWindow.pEditView.pGengrid; + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + + it = elm_gengrid_first_item_get(gengrid); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_checked) { + ap->mf_Status.flagFileSelect = TRUE; + (*count)++; + } + + it = elm_gengrid_item_next_get(it); + } + MF_TRACE_END; +} + +void mf_gengrid_create_grid_items(void *data, Evas_Object *grid, Eina_List *file_list) +{ + MF_TRACE_BEGIN; + mf_retm_if(grid == NULL, "grid is NULL"); + mf_retm_if(file_list == NULL, "file_list is NULL"); + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Eina_List *l = NULL; + void *pData = NULL; + mfItemData_s *m_TempItem = NULL; + + elm_gengrid_clear(grid); + + mf_debug("****************** count is [%d]", eina_list_count(file_list)); + EINA_LIST_FOREACH(file_list, l, pData) { + char *real_name = NULL; + + fsNodeInfo *pNode = (fsNodeInfo *)pData; + if (pNode == NULL) + continue; + real_name = g_strconcat(pNode->path, "/", pNode->name, NULL); + + if (real_name == NULL) { + continue; + } + mf_debug("************** gengrid item is [%s]", real_name); + m_TempItem = (mfItemData_s *) malloc(sizeof(mfItemData_s)); + if (m_TempItem == NULL) { + free(real_name); + real_name = NULL; + continue; + } + Elm_Object_Item *it = NULL; + + m_TempItem->m_ItemName = g_string_new(real_name); + m_TempItem->size = NULL; + m_TempItem->create_date = NULL; + m_TempItem->m_checked = FALSE; + m_TempItem->pCheckBox = NULL; + m_TempItem->thumb_path = NULL; + m_TempItem->real_thumb_flag = FALSE; + m_TempItem->unregister_lang_mgr = TRUE; + m_TempItem->media = NULL; + m_TempItem->ap = ap; + + if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY + || ap->mf_Status.more == MORE_INTERNAL_MOVE || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING){ + mf_debug(); + it = elm_gengrid_item_append(grid, &gic, m_TempItem, NULL, NULL); + mf_language_mgr_register_gengrid_item(it); + } else { + mf_debug(); + it = elm_gengrid_item_append(grid, &gic, m_TempItem, __mf_gengrid_icon_clicked, ap); + mf_language_mgr_register_gengrid_item(it); + } + m_TempItem->item = it; + free(real_name); + mf_debug(); + } +} + +void mf_gengrid_refresh(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + mf_gengrid_create_grid_items(ap, ap->mf_MainWindow.pNaviGengrid, ap->mf_FileOperation.file_list); +} + + +void mf_gengrid_item_select(void *data, Evas_Object *pGengrid, int *file_count, int *dir_count) +{ + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pGengrid == NULL, "pGengrid is NULL"); + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *it = NULL; + mfItemData_s *itemData = NULL; + //int error_code = 0; + + it = elm_gengrid_first_item_get(pGengrid); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_checked) { + if (mf_file_attr_is_dir(itemData->m_ItemName->str)) { + //bool systemfolder = FALSE; + ap->mf_Status.flagFolderSelect = TRUE; + (*dir_count)++; + } else { + ap->mf_Status.flagFileSelect = TRUE; + (*file_count)++; + } + } + + it = elm_gengrid_item_next_get(it); + + } +} + +void mf_gengrid_get_grid_selected_files(Evas_Object *gengrid, Eina_List **list) +{ + MF_TRACE_BEGIN; + mf_retm_if(gengrid == NULL, "gengrid is NULL"); + + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + GString *pTemp = NULL; + + it = elm_gengrid_first_item_get(gengrid); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_checked) { + pTemp = g_string_new(itemData->m_ItemName->str); + *list = eina_list_append(*list, pTemp); + } + it = elm_gengrid_item_next_get(it); + } + MF_TRACE_END; + +} + +void mf_gengrid_get_grid_selected_items(Evas_Object *gengrid, Eina_List **list) +{ + MF_TRACE_BEGIN; + mf_retm_if(gengrid == NULL, "gengrid is NULL"); + + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + + it = elm_gengrid_first_item_get(gengrid); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_checked) { + *list = eina_list_append(*list, itemData); + } + it = elm_gengrid_item_next_get(it); + } + MF_TRACE_END; + +} + +static Evas_Object *__mf_gengrid_item_icon_get(void *data, Evas_Object *obj, const char *part) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + struct appdata *ap = (struct appdata *)params->ap; + mf_retvm_if(params == NULL, NULL, "param is NULL"); + mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL"); + mf_retvm_if(part == NULL, NULL, "part is NULL"); + mf_retvm_if(obj == NULL, NULL, "obj is NULL"); + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + if (!strcmp(part, "elm.swallow.icon")) { + __mf_gengrid_get_thumbnail(params); + + Evas_Object *icon = elm_image_add(obj); + elm_image_file_set(icon, params->thumb_path, NULL); + elm_image_aspect_fixed_set(icon, EINA_FALSE); + evas_object_show(icon); + return icon; + } else if (!strcmp(part, "elm.swallow.block") && (params->ap->mf_Status.more == MORE_EDIT || params->ap->mf_Status.more == MORE_SHARE_EDIT)) { + if (ap->mf_Status.more == MORE_SHARE_EDIT) { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + return NULL; + } + } + Evas_Object *layout = elm_layout_add(obj); + elm_layout_theme_set(layout, "gengrid", "item", "block/default"); + evas_object_propagate_events_set(layout, 0); + evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, (Evas_Object_Event_Cb)mf_callback_rename_create_cb, params); + return layout; + } else if (!strcmp(part, "elm.swallow.end") && (params->ap->mf_Status.more == MORE_EDIT || params->ap->mf_Status.more == MORE_SHARE_EDIT)) + { + if (ap->mf_Status.more == MORE_SHARE_EDIT) { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + return NULL; + } + } + Evas_Object *ck = elm_check_add(obj); + mf_retvm_if(ck == NULL, NULL, "ck is NULL"); + elm_object_focus_set(ck, EINA_FALSE); + params->pCheckBox = ck; + elm_object_style_set(ck, "grid"); + evas_object_propagate_events_set(ck, 1); + mf_debug("params is [%p]params->m_checked is [%d]",params, params->m_checked); + elm_check_state_set(ck, params->m_checked); + elm_gengrid_item_selected_set(params->item, params->m_checked); + evas_object_smart_callback_add(ck, "changed", __mf_gengrid_item_check_changed, params); + evas_object_show(ck); + return ck; + } + return NULL; +} + +static char *__mf_gengrid_item_label_get(void *data, Evas_Object * obj, const char *part) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + mf_retv_if(params == NULL, NULL); + + if (strcmp(part, "elm.text") == 0) { + /* supporting multi-lang for default folders */ + + if (g_strcmp0(params->m_ItemName->str, PHONE_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_PHONE)); + } else if (g_strcmp0(params->m_ItemName->str, MEMORY_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_MMC)); + } else if (g_strcmp0(params->m_ItemName->str, OTG_FOLDER) == 0) { + return g_strdup(GET_STR(MF_LABEL_OTG)); + }else { + if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) { + char *markup_name = NULL; + bool res = false; + markup_name = (char *)mf_util_search_markup_keyword(ecore_file_file_get(params->m_ItemName->str), params->ap->mf_Status.search_filter, &res); + if(res) { + MF_TRACE_END; + return g_strdup(markup_name); + } + } + + if (params->ap->mf_Status.iExtensionState == MF_EXTENSION_HIDE && !mf_file_attr_is_dir(params->m_ItemName->str)) { + return mf_fm_svc_get_file_name(params->m_ItemName); + + } else { + return g_strdup(ecore_file_file_get(params->m_ItemName->str)); + } + } + } else { + return strdup(_("")); + } + MF_TRACE_END; +} + +static void __mf_gengrid_item_del(void *data, Evas_Object * obj) +{ + mfItemData_s *params = (mfItemData_s *) data; + assert(params); + if (params->m_ItemName) { + g_string_free(params->m_ItemName, TRUE); + params->m_ItemName = NULL; + } + if (params->thumb_path) { + free(params->thumb_path); + params->thumb_path = NULL; + } + if (params->create_date) { + free(params->create_date); + params->create_date = NULL; + } + if (params->size) { + free(params->size); + params->size = NULL; + } + if (params->media) { + media_info_cancel_thumbnail(params->media); + media_info_destroy(params->media); + params->media = NULL; + } + free(params); + return; +} + + + +void mf_gengrid_gen_style_set() +{ + gic.item_style = "default_gridtext"; + gic.func.text_get = __mf_gengrid_item_label_get; + gic.func.content_get = __mf_gengrid_item_icon_get; + gic.func.state_get = NULL; + gic.func.del = __mf_gengrid_item_del; +} + +Evas_Object *mf_gengrid_create(Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *grid = NULL; + grid = mf_gengrid_create_grid(parent); + mf_gengrid_gen_style_set(); + return grid; +} + +Evas_Object *mf_gengrid_create_grid (Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + Evas_Object *grid = NULL; + grid = elm_gengrid_add(parent); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_focus_set(grid, EINA_FALSE); + + elm_gengrid_align_set(grid, 0.0, 0.0); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_show(grid); + return grid; +} + +void mf_gengrid_create_list_default_style(Evas_Object *pGengrid, void *data, Eina_List *dir_list, + Eina_List *file_list) +{ + + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pGengrid == NULL, "pGengrid is NULL"); + /*0. variable definition and parameter check*/ + struct appdata *ap = (struct appdata *)data; + + fsNodeInfo *pNode = NULL; + Eina_List *l = NULL; + + EINA_LIST_FOREACH(dir_list, l, pNode) { + mf_widget_item_append(pGengrid, pNode, ap); + } + /* add file items into the genlist */ + + EINA_LIST_FOREACH(file_list, l, pNode) { + mf_widget_item_append(pGengrid, pNode, ap); + } +} + +static void __mf_gengrid_thumbs_longpressed(void *data, Evas_Object *obj, + void *event_info) +{ + mf_retm_if(event_info == NULL, "event_info is NULL"); + + mfItemData_s *it_data = elm_object_item_data_get(event_info); + mf_retm_if(it_data == NULL, "it_data is NULL"); + + mf_context_popup_create_gengrid(it_data); +} +Evas_Object *mf_gengrid_create_list(void *data, Evas_Object *parent) +{ + + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + struct appdata *ap = (struct appdata *)data; + Evas_Object *gengrid = NULL; + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + + + if (ap->mf_Status.view_type == mf_view_root_category) { + file_list = ap->mf_FileOperation.category_list; + } else { + file_list = ap->mf_FileOperation.file_list; + dir_list = ap->mf_FileOperation.folder_list; + } + + gengrid = mf_gengrid_create(parent); + + evas_object_smart_callback_add(gengrid, "longpressed", + __mf_gengrid_thumbs_longpressed, ap); + elm_gengrid_item_size_set(gengrid, MF_HD_GENGRID_ITEM_WIDTH, MF_HD_GENGRID_ITEM_HEIGTH); + + if (gengrid == NULL) { + return NULL; + } + evas_object_smart_callback_add(gengrid, "selected", __mf_gengrid_icon_clicked, ap); + mf_gengrid_create_list_default_style(gengrid, ap, dir_list, file_list); + MF_TRACE_END; + return gengrid; +} + diff --git a/src/widget/mf-genlist.c b/src/widget/mf-genlist.c new file mode 100644 index 0000000..1be7531 --- /dev/null +++ b/src/widget/mf-genlist.c @@ -0,0 +1,1843 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include + +#include +#include +#include + +#include "mf-main.h" +#include "mf-widget.h" +#include "mf-util.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-fs-util.h" +#include "mf-gadget.h" +#include "mf-dlog.h" +#include "mf-ta.h" +#include "mf-delete.h" +#include "mf-launch.h" +#include "mf-resource.h" +#include "mf-language-mgr.h" + +#define NUM_OF_GENLIST_STYLES 4 +#define NUM_OF_ITEMS 50 +#define MF_DATE_FORMAT_DD_MM_YYYY "%d-%b-%Y " +#define MF_DATE_FORMAT_MM_DD_YYYY "%b-%d-%Y " +#define MF_DATE_FORMAT_YYYY_MM_DD "%Y-%b-%d " +#define MF_DATE_FORMAT_YYYY_DD_MM "%Y-%d-%b " +#define MF_TIME_FORMAT_12HOUR "%l:%M%p" +#define MF_TIME_FORMAT_24HOUR "%H:%M" +#define MF_ROUND_D(x, dig) (floor((x) * pow(10, dig+1) + 0.5) / pow(10, dig+1)) + +typedef struct { + void *data; + Evas_Object *pGenlist; +} renameData_s; + +/**** Global definition ****/ +Elm_Genlist_Item_Class itc, userfolderitc, categoryitc, newfolderitc, indexitc; +Elm_Genlist_Item_Class left_itc; +Elm_Genlist_Item_Class search_itc; +static Elm_Genlist_Item_Class itch; + + +/*** static function declare ***/ +static char *__mf_genlist_gl_label_get(void *data, Evas_Object *obj, const char *part); +static Evas_Object *__mf_genlist_gl_default_icon_get(void *data, Evas_Object *obj, const char *part); +static Evas_Object *__mf_genlist_gl_edit_icon_get(void *data, Evas_Object *obj, const char *part); +static void __mf_genlist_gl_del(void *data, Evas_Object *obj); +static Eina_Bool __mf_genlist_gl_state_get(void *data, Evas_Object *obj, const char *part); +static inline void __mf_genlist_get_thumbnail(mfItemData_s *params); + + +void mf_genlist_rename_done(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input ad is NULL"); + + if (ap->mf_FileOperation.rename_item && elm_genlist_item_flip_get(ap->mf_FileOperation.rename_item)) { + //elm_genlist_item_flip_set(ap->mf_FileOperation.rename_item, EINA_FALSE); + //elm_genlist_item_select_mode_set(ap->mf_FileOperation.rename_item, ELM_OBJECT_SELECT_MODE_DEFAULT); + } + mf_callback_rename_save_cb(ap, obj, event_info); + MF_TRACE_END; +} + + +static Evas_Object *__mf_genlist_rename_editfiled_create(void *data, Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + mf_retvm_if(params == NULL, NULL, "param is NULL"); + mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL"); + + struct appdata *ap = (struct appdata *)params->ap; + mf_retvm_if(ap == NULL, NULL, "input parameter data error"); + + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Evas_Object *edit_field = NULL; + Evas_Object *entry = NULL; + GString *filename = NULL; + + edit_field = mf_widget_create_editfield(parent, &entry); + + evas_object_size_hint_weight_set(edit_field, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(edit_field, EVAS_HINT_FILL, EVAS_HINT_FILL); + + + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_signal_emit(edit_field, "elm,state,eraser,show", "elm"); + //elm_editfield_eraser_set(edit_field, EINA_TRUE); + + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + params->ap->mf_MainWindow.pEntry = entry; + params->ap->mf_MainWindow.pEditField = edit_field; + + if (params->ap->mf_FileOperation.to_rename != NULL) { + g_string_free(params->ap->mf_FileOperation.to_rename, TRUE); + params->ap->mf_FileOperation.to_rename = NULL; + } + params->ap->mf_FileOperation.to_rename = g_string_new((char *)params->m_ItemName->str); + + + /* the below is sample code for control entry. It is not mandatory.*/ + + /* set guide text */ + filename = mf_fm_svc_wrapper_get_file_name(ap->mf_FileOperation.to_rename); + char *guide_text = NULL; + SAFE_FREE_CHAR(ap->mf_FileOperation.file_name_suffix); + if (!mf_file_attr_is_dir(ap->mf_FileOperation.to_rename->str)) { + mf_debug(); + char *ext = NULL; + char *name_without_ext = NULL; + name_without_ext = g_strdup(ap->mf_FileOperation.to_rename->str); + mf_file_attr_get_file_ext(ap->mf_FileOperation.to_rename->str, &ext); + mf_debug("ext is %s", ext); + if (ext && strlen(ext) != 0) { + mf_debug(); + name_without_ext[strlen(name_without_ext) - strlen(ext) - 1] = '\0'; + ap->mf_FileOperation.file_name_suffix = strdup(ext); + mf_debug("name_without_ext is [%s]\n", name_without_ext); + if (strlen(name_without_ext)) { + guide_text = elm_entry_utf8_to_markup(ecore_file_file_get(name_without_ext)); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + SAFE_FREE_CHAR(ext); + SAFE_FREE_CHAR(name_without_ext); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + if (ap->mf_FileOperation.file_name_suffix) { + limit_filter_data.max_char_count = (MYFILE_FILE_NAME_LEN_MAX - mf_util_character_count_get(ap->mf_FileOperation.file_name_suffix) - 1); + } else { + limit_filter_data.max_char_count = MYFILE_FILE_NAME_LEN_MAX; + } + + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(ap->mf_MainWindow.pEntry, elm_entry_filter_limit_size, &limit_filter_data); + elm_entry_input_panel_return_key_type_set(ap->mf_MainWindow.pEntry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + + elm_entry_entry_set(ap->mf_MainWindow.pEntry, guide_text); + /*elm_entry_entry_set(entry, ecore_file_file_get(params->m_ItemName->str));*/ + elm_entry_cursor_end_set(entry); + + SAFE_FREE_CHAR(guide_text); + SAFE_FREE_GSTRING(filename); + + evas_object_smart_callback_add(entry, "activated", mf_genlist_rename_done, params->ap); + evas_object_smart_callback_add(entry, "changed", mf_callback_imf_changed_cb, params->ap); + evas_object_smart_callback_add(entry, "maxlength,reached", mf_callback_max_len_reached_cb, params->ap); + evas_object_smart_callback_add(entry, "preedit,changed", + mf_callback_imf_preedit_change_cb, ap); + + elm_object_signal_callback_add(edit_field, "elm,eraser,clicked", "elm", mf_callback_eraser_clicked_cb, entry); + evas_object_show(entry); + elm_object_focus_set(entry, EINA_TRUE); + + MF_TRACE_END; + return edit_field; +} + +void mf_genlist_gl_mode_sweep_set(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(event_info == NULL, "event_info is NULL"); + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); + +#ifndef MYFILE_ADD_TO_HOME +#ifndef MYFILE_DETAILS + if (ap->mf_Status.view_type == mf_view_root) + return; +#endif +#endif + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } else if(ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT) { + return; + } + + if (ap->mf_Status.more == MORE_RENAME) { + mf_callback_destory_rename(ap); + } + /* Start genlist sweep */ + Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj); + if (it && (it != event_info)) { + elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT); + } else { + mf_debug("no decorated mode item"); + } + + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE); + elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_NONE); + + MF_TRACE_END; +} + +void mf_genlist_gl_mode_sweep_unset(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); +#ifndef MYFILE_ADD_TO_HOME +#ifndef MYFILE_DETAILS + if (ap->mf_Status.view_type == mf_view_root) + return; +#endif +#endif + + if (!event_info) + return; + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } else if(ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT) { + return; + } + + + /* Finish genlist sweep */ + elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_DEFAULT); + MF_TRACE_END; +} + +void mf_genlist_gl_mode_cancel(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is null"); +#ifndef MYFILE_ADD_TO_HOME +#ifndef MYFILE_DETAILS + if (ap->mf_Status.view_type == mf_view_root) + return; +#endif +#endif + if (!obj) + return; + + if (ap->mf_Status.more == MORE_RENAME) { + //mf_genlist_rename_done(ap, NULL, NULL); + return; + } else if(ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT) { + return; + } + /* Get sweeped item */ + Elm_Object_Item *it = (Elm_Object_Item *) elm_genlist_decorated_item_get(obj); + + + /* Finish genlist sweep */ + if (it) { + elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT); + } + MF_TRACE_END; +} + +/** label related **/ +static char *__mf_genlist_gl_label_get(void *data, Evas_Object * obj, const char *part) +{ + + mfItemData_s *params = (mfItemData_s *) data; + mf_retv_if(params == NULL, NULL); + mf_debug("part=%s", part); + if (strcmp(part, "elm.text") == 0) { + /* supporting multi-lang for default folders */ + if (g_strcmp0(params->m_ItemName->str, PHONE_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_PHONE)); + } else if (g_strcmp0(params->m_ItemName->str, MEMORY_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_MMC)); + } else if (g_strcmp0(params->m_ItemName->str, OTG_FOLDER) == 0) { + return g_strdup(GET_STR(MF_LABEL_OTG)); + } else { + if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) { + char *markup_name = NULL; + bool res = false; + markup_name = (char *)mf_util_search_markup_keyword(ecore_file_file_get(params->m_ItemName->str), params->ap->mf_Status.search_filter, &res); + if(res) { + return g_strdup(markup_name); + } + } + if (params->ap->mf_Status.iExtensionState == MF_EXTENSION_HIDE && !mf_file_attr_is_dir(params->m_ItemName->str)) { + return mf_fm_svc_get_file_name(params->m_ItemName); + + } else { + return g_strdup(ecore_file_file_get(params->m_ItemName->str)); + } + } + } else if (strcmp(part, "elm.uptitle.text") == 0) { + return g_strdup(params->m_ItemName->str); + } else if (strcmp(part, "elm.slide_base.text") == 0) { + return g_strdup(ecore_file_file_get(params->m_ItemName->str)); + } else if (strcmp(part, "elm.slide.text.1") == 0) { + return g_strdup(ecore_file_file_get(params->m_ItemName->str)); + } else if (strcmp(part, "elm.text.1") == 0) { + if (g_strcmp0(params->m_ItemName->str, PHONE_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_PHONE)); + } else if (g_strcmp0(params->m_ItemName->str, MEMORY_FOLDER) == 0) { + return g_strdup(GET_SYS_STR(MF_LABEL_MMC)); + } else if (g_strcmp0(params->m_ItemName->str, OTG_FOLDER) == 0) { + return g_strdup(GET_STR(MF_LABEL_OTG)); + } else if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) { + char *markup_name = NULL; + bool res = false; + markup_name = (char *)mf_util_search_markup_keyword(ecore_file_file_get(params->m_ItemName->str), params->ap->mf_Status.search_filter, &res); + if(res) { + return g_strdup(markup_name); + } + } + if (params->ap->mf_Status.iExtensionState == MF_EXTENSION_HIDE && !mf_file_attr_is_dir(params->m_ItemName->str)) { + return mf_fm_svc_get_file_name(params->m_ItemName); + + } else { + return g_strdup(ecore_file_file_get(params->m_ItemName->str)); + } + } else if (strcmp(part, "elm.text.2") == 0) { + + if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) { + int root_len = 0; + char *new_path = NULL; + GString *parent_path = NULL; + parent_path = mf_fm_svc_wrapper_get_file_parent_path(params->m_ItemName); + if (parent_path) { + switch(mf_fm_svc_wrapper_get_location(parent_path->str)) { + case MYFILE_PHONE: + root_len = strlen(PHONE_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_PHONE), parent_path->str + root_len, NULL); + break; + case MYFILE_MMC: + root_len = strlen(MEMORY_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_MMC), parent_path->str + root_len, NULL); + break; + case MYFILE_OTG: + root_len = strlen(OTG_FOLDER); + new_path = g_strconcat(GET_STR(MF_LABEL_OTG), parent_path->str + root_len, NULL); + break; + default: + break; + } + SAFE_FREE_GSTRING(parent_path); + } + + return new_path; + } else if (params->ap->mf_Status.more != MORE_SEARCH + && params->ap->mf_Status.view_type == mf_view_root_category) { + int root_len = 0; + char *new_path = NULL; + GString *parent_path = NULL; + parent_path = mf_fm_svc_wrapper_get_file_parent_path(params->m_ItemName); + if (parent_path) { + switch(mf_fm_svc_wrapper_get_location(parent_path->str)) { + case MYFILE_PHONE: + root_len = strlen(PHONE_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_PHONE), parent_path->str + root_len, NULL); + break; + case MYFILE_MMC: + root_len = strlen(MEMORY_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_MMC), parent_path->str + root_len, NULL); + break; + case MYFILE_OTG: + root_len = strlen(OTG_FOLDER); + new_path = g_strconcat(GET_SYS_STR(MF_LABEL_OTG), parent_path->str + root_len, NULL); + break; + default: + break; + } + SAFE_FREE_GSTRING(parent_path); + } + + return new_path; + } else { + if (params->ap->mf_Status.flagViewType != MF_VIEW_SYTLE_LIST_DETAIL) { + int iSortTypeValue = 0; + mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + if (iSortTypeValue == MYFILE_SORT_BY_SIZE_S2L || iSortTypeValue == MYFILE_SORT_BY_SIZE_L2S) { + if (params->size) { + return g_strdup(params->size); + } else { + return NULL; + } + } else if (iSortTypeValue == MYFILE_SORT_BY_DATE_O2R || iSortTypeValue == MYFILE_SORT_BY_DATE_R2O) { + if (params->create_date) { + return g_strdup(params->create_date); + } else { + return NULL; + } + } else { + return NULL; + } + } else { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + Eina_List *file_list = NULL; + Eina_List *folder_list = NULL; + int ret = 0; + ret = mf_fs_oper_read_dir(params->m_ItemName->str, &folder_list, &file_list); + if (ret == MYFILE_ERR_NONE) { + int count = 0; + count = eina_list_count(file_list) + eina_list_count(folder_list); + mf_util_free_eina_list_with_data(&file_list, MYFILE_TYPE_FSNODE); + mf_util_free_eina_list_with_data(&folder_list, MYFILE_TYPE_FSNODE); + return g_strdup_printf("%d items", count); + } else { + return g_strdup(_("")); + } + } else { + if (params->size) { + return g_strdup(params->size); + } else { + return NULL; + } + } + } + + } + } else if (strcmp(part, "elm.text.3") == 0) { + if (params->create_date) { + return g_strdup(params->create_date); + } else { + return NULL; + } + + } else { + return g_strdup(_("")); + } +} + +/** icon related **/ +static Evas_Object *__mf_genlist_gl_default_icon_get(void *data, Evas_Object * obj, const char *part) +{ + Evas_Object *layout = NULL; + mfItemData_s *params = (mfItemData_s *) data; + + mf_retvm_if(params == NULL, NULL, "param is NULL"); + mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL"); + mf_retvm_if(part == NULL, NULL, "part is NULL"); + mf_retvm_if(obj == NULL, NULL, "obj is NULL"); + mf_debug("part=%s", part); + + if (!strcmp(part, "elm.icon") || !strcmp(part, "elm.icon.1")) { + Evas_Object *thumb = NULL; + Evas_Object *ic_memory = NULL; + MF_STORAGE is_in_mmc = FALSE; + char *key = NULL; + const char *memory_icon_path = MF_ICON_MEMORY_SUB; + + __mf_genlist_get_thumbnail(params); + layout = mf_widget_create_layout(obj, EDJ_NAME, GRP_THUMBNAIL_ONLY); + evas_object_size_hint_aspect_set(layout, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + if (layout) { + thumb = elm_image_add(layout); + elm_object_focus_set(thumb, EINA_FALSE); + if (thumb == NULL) { + mf_error("thumb is NULL"); + return NULL; + } + elm_image_file_set(thumb, params->thumb_path, NULL); + elm_object_part_content_set(layout, "thumbnail", thumb); + + mf_file_attr_get_store_type_by_full(params->m_ItemName->str, &is_in_mmc); + if (is_in_mmc == MYFILE_MMC) { + ic_memory = elm_image_add(layout); + elm_object_focus_set(ic_memory, EINA_FALSE); + elm_image_file_set(ic_memory, memory_icon_path, key); + evas_object_show(ic_memory); + elm_object_part_content_set(layout, "myfile.memory_icon_multi.sub", ic_memory); + } + + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + if (type == FILE_TYPE_VIDEO) { + const char *play_icon_path = MF_ICON_VIDEO_PLAY; + Evas_Object *play_icon = NULL; + play_icon = elm_image_add(layout); + elm_object_focus_set(play_icon, EINA_FALSE); + elm_image_file_set(play_icon, play_icon_path, key); + evas_object_show(play_icon); + elm_object_part_content_set(layout, "video_play", play_icon); + } + } + } else if (!strcmp(part, "elm.icon.2")) { + if (params->ap->mf_Status.more == MORE_EDIT || params->ap->mf_Status.more == MORE_SHARE_EDIT) { + return NULL; + } + Evas_Object *entry_button = NULL; + Evas_Object *entry_icon = NULL; + entry_button = elm_button_add(obj); + elm_object_style_set(entry_button, "circle/empty"); + + entry_icon = elm_image_add(entry_button); + char *play_icon = strdup(MF_ICON_ENTRY_FOLDER); + elm_image_file_set(entry_icon, play_icon, NULL); + evas_object_size_hint_aspect_set(entry_icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + elm_object_part_content_set(entry_button, "icon", entry_icon); + evas_object_propagate_events_set(entry_button, EINA_FALSE); + evas_object_smart_callback_add(entry_button, "pressed", mf_callback_entry_button_pressed_cb, play_icon); + evas_object_smart_callback_add(entry_button, "unpressed", mf_callback_entry_button_unpressed_cb, play_icon); + evas_object_smart_callback_add(entry_button, "clicked", (Evas_Smart_Cb)mf_callback_entry_cb, (void*)params); + return entry_button; + } + else if (!strcmp(part, "elm.base.swallow.detail")) { + } else if (!strcmp(part, "elm.slide.swallow.1")) { + if (params->ap->mf_Status.view_type == mf_view_root && params->ap->mf_Status.more != MORE_SEARCH) { + } + else + { + layout = elm_button_add(obj); + elm_object_style_set(layout, "sweep/multiline"); + elm_object_text_set(layout, GET_SYS_STR(LABEL_RENAME)); + mf_language_mgr_register_object(layout, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_RENAME); + evas_object_smart_callback_add(layout, "clicked", (Evas_Smart_Cb) mf_callback_rename_button_callback, data); + } + } else if (!strcmp(part, "elm.slide.swallow.2")) { + + if (params->ap->mf_Status.view_type == mf_view_root && params->ap->mf_Status.more != MORE_SEARCH) { + + } else { + layout = elm_button_add(obj); + elm_object_style_set(layout, "sweep/delete"); + elm_object_text_set(layout, GET_SYS_STR(LABEL_DELETE)); + mf_language_mgr_register_object(layout, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_DELETE); + evas_object_smart_callback_add(layout, "clicked", mf_callback_delete_button_cb, data); + } + } else if (!strcmp(part, "elm.slide.swallow.3")) { + layout = elm_button_add(obj); + elm_object_style_set(layout, "sweep/delete"); + elm_object_text_set(layout, GET_SYS_STR(LABEL_DELETE)); + mf_language_mgr_register_object(layout, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_DELETE); + evas_object_smart_callback_add(layout, "clicked", mf_callback_delete_button_cb, data); + } else if (!strcmp(part, "elm.slide.swallow.4")) { + layout = elm_button_add(obj); + elm_object_style_set(layout, "sweep/delete"); + elm_object_text_set(layout, GET_SYS_STR(LABEL_DELETE)); + mf_language_mgr_register_object(layout, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_DELETE); + evas_object_smart_callback_add(layout, "clicked", mf_callback_delete_button_cb, data); + } else if (!strcmp(part, "elm.flip.content")) { /* this is used when the rename mode is enabled.*/ + Evas_Object *edit_field = NULL; + edit_field = __mf_genlist_rename_editfiled_create(params, obj); + evas_object_propagate_events_set(edit_field, EINA_FALSE); + return edit_field; + } else if (!strcmp(part, "elm.flip.icon")) { + Evas_Object *cancel_btn = mf_widget_util_create_button(obj, NULL, LABEL_CANCEL, NULL, + mf_callback_cancel_cb, params->ap); + evas_object_show(cancel_btn); + return cancel_btn; + } + return layout; +} + +void mf_genlist_item_check_changed_callback(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + mf_retm_if(params == NULL, "param is NULL"); + + struct appdata *ap = (struct appdata *)params->ap; + mf_retm_if(ap == NULL, "input parameter data error"); + mf_retm_if(obj == NULL, "obj is NULL"); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + params->m_checked = !params->m_checked; + elm_check_state_pointer_set(obj, ¶ms->m_checked); + return; + } + + if (params->m_checked) { + ap->mf_MainWindow.pEditView.iCheckedCount++; + } else { + ap->mf_MainWindow.pEditView.iCheckedCount--; + } + + + if (ap->mf_MainWindow.pEditView.iTotalCount == ap->mf_MainWindow.pEditView.iCheckedCount) { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_TRUE; + } else { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_FALSE; + } + mf_genlist_gl_edit_item_selected(ap); + MF_TRACE_END; +} + +static void __mf_genlist_selected_all_items_set(Evas_Object *genlist, int value) +{ + MF_TRACE_BEGIN; + mf_retm_if(genlist == NULL, "genlist is NULL"); + + mfItemData_s *it_data; + Elm_Object_Item *it; + + it = elm_genlist_first_item_get(genlist); + while (it) { + it_data = elm_object_item_data_get(it); + if (it_data && it_data->ap->mf_Status.more == MORE_SHARE_EDIT) { + if (mf_file_attr_is_dir(it_data->m_ItemName->str)) { + it = elm_genlist_item_next_get(it); + continue; + } + } + if (it_data) + it_data->m_checked = value; + //elm_check_state_pointer_set(it_data->pCheckBox, it_data->m_checked); + elm_genlist_item_fields_update(it, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT); + it = elm_genlist_item_next_get(it); + } + MF_TRACE_END; +} + +static void __mf_genlist_check_select_all(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + if (ap->mf_MainWindow.pEditView.bSelectAllChecked) { + ap->mf_MainWindow.pEditView.iCheckedCount = ap->mf_MainWindow.pEditView.iTotalCount; + } else { + ap->mf_MainWindow.pEditView.iCheckedCount = 0; + } + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + __mf_genlist_selected_all_items_set(ap->mf_MainWindow.pEditView.pGenlist, ap->mf_MainWindow.pEditView.bSelectAllChecked); + }else { + mf_gengrid_select_all(ap); + } + mf_genlist_gl_edit_item_selected(ap); + MF_TRACE_END; +} + + +void __mf_genlist_select_all_layout_mouse_down_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } + + ap->mf_MainWindow.pEditView.bSelectAllChecked = !ap->mf_MainWindow.pEditView.bSelectAllChecked; + //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked); + + __mf_genlist_check_select_all(ap); + MF_TRACE_END; +} + + +void __mf_genlist_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + ap->mf_MainWindow.pEditView.bSelectAllChecked = !ap->mf_MainWindow.pEditView.bSelectAllChecked; + //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked); + return; + } + + __mf_genlist_check_select_all(ap); + + MF_TRACE_END; +} + +static Evas_Object *__mf_genlist_gl_edit_icon_get(void *data, Evas_Object * obj, const char *part) +{ + Evas_Object *layout = NULL; + mfItemData_s *params = (mfItemData_s *) data; + struct appdata *ap = (struct appdata *)params->ap; + + mf_retvm_if(params == NULL, NULL, "param is NULL"); + mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL"); + mf_retvm_if(part == NULL, NULL, "part is NULL"); + mf_retvm_if(obj == NULL, NULL, "obj is NULL"); + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + if (elm_genlist_decorate_mode_get(obj)) { + if (!strcmp(part, "elm.edit.icon.1")) { + Evas_Object *check = NULL; + check = elm_check_add(obj); + elm_object_focus_set(check, EINA_FALSE); + evas_object_propagate_events_set(check, EINA_FALSE); + elm_check_state_pointer_set(check, ¶ms->m_checked); + evas_object_smart_callback_add(check, "changed", mf_genlist_item_check_changed_callback, params); + return check; + } else if (!strcmp(part, "elm.edit.icon.2")) { + layout = elm_button_add(obj); + elm_object_style_set(layout, "rename"); + evas_object_propagate_events_set(layout, EINA_FALSE); + evas_object_smart_callback_add(layout, "clicked", mf_callback_rename_button_callback, params); + return layout; + } + } + if (!strcmp(part, "elm.icon") || !strcmp(part, "elm.icon.1")) { + Evas_Object *thumb = NULL; + Evas_Object *ic_memory = NULL; + MF_STORAGE is_in_mmc = FALSE; + char *key = NULL; + const char *memory_icon_path = MF_ICON_MEMORY_SUB; + + __mf_genlist_get_thumbnail(params); +#ifdef USE_IMAGE_OBJECT + thumb = evas_object_image_add(evas_object_evas_get(obj)); +#else + thumb = elm_image_add(obj); + elm_object_focus_set(thumb, EINA_FALSE); +#endif + if (thumb == NULL) + mf_error("thumb is NULL"); + + if (thumb) { +#ifdef USE_IMAGE_OBJECT + int load_err = EVAS_LOAD_ERROR_NONE; + evas_object_image_file_set(thumb, params->thumb_path, NULL); + load_err = evas_object_image_load_error_get(thumb); + + if (load_err != EVAS_LOAD_ERROR_NONE) { + evas_object_del(thumb); + mf_error("load error code : %d", load_err); + } else { + evas_object_image_filled_set(thumb, EINA_TRUE); + } +#else + elm_image_file_set(thumb, params->thumb_path, NULL); +#endif + layout = elm_layout_add(obj); + elm_object_focus_set(layout, EINA_FALSE); + elm_layout_file_set(layout, EDJ_NAME, GRP_THUMBNAIL_ONLY); + elm_object_part_content_set(layout, "thumbnail", thumb); + + mf_file_attr_get_store_type_by_full(params->m_ItemName->str, &is_in_mmc); + if (is_in_mmc == MYFILE_MMC) { + ic_memory = elm_image_add(obj); + elm_object_focus_set(ic_memory, EINA_FALSE); + elm_image_file_set(ic_memory, memory_icon_path, key); + evas_object_show(ic_memory); + elm_object_part_content_set(layout, "myfile.memory_icon_multi.sub", ic_memory); + } + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + if (type == FILE_TYPE_VIDEO) { + const char *play_icon_path = MF_ICON_VIDEO_PLAY; + Evas_Object *play_icon = NULL; + play_icon = elm_image_add(layout); + elm_object_focus_set(play_icon, EINA_FALSE); + elm_image_file_set(play_icon, play_icon_path, key); + evas_object_show(play_icon); + elm_object_part_content_set(layout, "video_play", play_icon); + } + } + } else if (!strcmp(part, "elm.icon.2")) { + if (params->ap->mf_Status.more == MORE_EDIT || (params->ap->mf_Status.preMore == MORE_EDIT && params->ap->mf_Status.more == MORE_RENAME)) { + return NULL; + } + Evas_Object *entry_button = NULL; + Evas_Object *entry_icon = NULL; + entry_button = elm_button_add(obj); + elm_object_style_set(entry_button, "circle/empty"); + + entry_icon = elm_image_add(entry_button); + char *play_icon = strdup(MF_ICON_ENTRY_FOLDER); + elm_image_file_set(entry_icon, play_icon, NULL); + evas_object_size_hint_aspect_set(entry_icon, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + elm_object_part_content_set(entry_button, "icon", entry_icon); + evas_object_propagate_events_set(entry_button, EINA_FALSE); + evas_object_smart_callback_add(entry_button, "clicked", (Evas_Smart_Cb)mf_callback_entry_cb, (void*)params); + evas_object_smart_callback_add(entry_button, "pressed", mf_callback_entry_button_pressed_cb, play_icon); + evas_object_smart_callback_add(entry_button, "unpressed", mf_callback_entry_button_unpressed_cb, play_icon); + return entry_button; + } else if (!strcmp(part, "elm.swallow.end")) { + if (ap->mf_Status.rotation_type != MF_ROTATE_LANDSCAPE) { + //bool systemfolder = false; + //int error_code = 0; +#if 0 + error_code = mf_fm_svc_wrapper_get_folder_foldersystem(params->m_ItemName, &systemfolder); + if (systemfolder == FALSE) { +#endif + /*__mf_genlist_add_rename_button*/ + layout = elm_button_add(obj); + //elm_object_focus_set(layout, EINA_FALSE); + elm_object_style_set(layout, "rename"); + evas_object_propagate_events_set(layout, EINA_FALSE); + evas_object_smart_callback_add(layout, "clicked", mf_callback_rename_button_callback, params); + /*evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, mf_callback_rename_button_callback, params);*/ + //} + } + } else if (!strcmp(part, "elm.flip.content")) { /* this is used when the rename mode is enabled.*/ + Evas_Object *edit_field = NULL; + edit_field = __mf_genlist_rename_editfiled_create(params, obj); + evas_object_propagate_events_set(edit_field, EINA_FALSE); + return edit_field; + } else if (!strcmp(part, "elm.flip.icon")) { + Evas_Object *cancel_btn = mf_widget_util_create_button(obj, NULL, LABEL_CANCEL, NULL, + mf_callback_cancel_cb, params->ap); + evas_object_show(cancel_btn); + return cancel_btn; + } + + return layout; +} + + +static Evas_Object *__mf_genlist_gl_new_folder_icon_get(void *data, Evas_Object * obj, const char *part) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + if (!strcmp(part, "elm.icon")) { + int error_code = 0; + char *fileName = NULL; + char *fullpath = (char *)malloc(sizeof(char) * MYFILE_FILE_PATH_LEN_MAX); + if (fullpath == NULL) { + return NULL; + } + GString *dest_fullpath; + static Elm_Entry_Filter_Limit_Size limit_filter; + Evas_Object *entry = ap->mf_MainWindow.pEntry; + + Evas_Object *edit_field = ap->mf_MainWindow.pEditField; + + limit_filter.max_char_count = MYFILE_FILE_NAME_LEN_MAX; + limit_filter.max_byte_count = 0; + + memset(fullpath, 0, MYFILE_FILE_PATH_LEN_MAX); + fileName = elm_entry_markup_to_utf8(GET_SYS_STR(MF_LABEL_FOLDER)); + snprintf(fullpath, (MYFILE_FILE_PATH_LEN_MAX), "%s/%s", (char *)ap->mf_Status.path->str, fileName); + + dest_fullpath = g_string_new(fullpath); + + elm_entry_markup_filter_append(ap->mf_MainWindow.pEntry, elm_entry_filter_limit_size, &limit_filter); + evas_object_smart_callback_add(ap->mf_MainWindow.pEntry, "maxlength,reached", mf_callback_max_len_reached_cb, ap); + + if (mf_fm_svc_wrapper_detect_duplication(dest_fullpath)) { + mf_debug("dectetion result is TRUE\ndest_fullpath is %s\n", dest_fullpath->str); + error_code = mf_fm_svc_wrapper_file_auto_rename(ap, dest_fullpath, FILE_NAME_WITH_BRACKETS, &dest_fullpath); + mf_debug("rename result is %s\n", dest_fullpath->str); + memset(fullpath, 0, strlen(fullpath)); + int len = strlen(ap->mf_Status.path->str) + 1; + strncpy(fullpath, dest_fullpath->str + len, MYFILE_FILE_PATH_LEN_MAX); + /*memset(fileName,0,strlen(fileName));*/ + + SAFE_FREE_CHAR(fileName); + fileName = elm_entry_markup_to_utf8(fullpath); + } + + /*elm_entry_entry_set(entry, ecore_file_file_get(params->m_ItemName->str));*/ + + elm_entry_entry_set(entry, fileName); + elm_entry_cursor_end_set(entry); + + SAFE_FREE_CHAR(fullpath); + SAFE_FREE_GSTRING(dest_fullpath); + SAFE_FREE_CHAR(fileName); + return edit_field; + } + return NULL; +} + +static Evas_Object *__mf_genlist_gl_rename_icon_get(void *data, Evas_Object * obj, const char *part) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + if (!strcmp(part, "elm.icon")) { + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Evas_Object *edit_field = NULL; + Evas_Object *entry = NULL; + GString *filename = NULL; + + edit_field = mf_widget_create_editfield(obj, &entry); + + evas_object_size_hint_weight_set(edit_field, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(edit_field, EVAS_HINT_FILL, EVAS_HINT_FILL); + + + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_signal_emit(edit_field, "elm,state,eraser,show", "elm"); + //elm_editfield_eraser_set(edit_field, EINA_TRUE); + + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + ap->mf_MainWindow.pEntry = entry; + ap->mf_MainWindow.pEditField = edit_field; + + + /* set guide text */ + filename = mf_fm_svc_wrapper_get_file_name(ap->mf_FileOperation.to_rename); + char *guide_text = NULL; + SAFE_FREE_CHAR(ap->mf_FileOperation.file_name_suffix); + if (!mf_file_attr_is_dir(ap->mf_FileOperation.to_rename->str)) { + mf_debug(); + char *ext = NULL; + char *name_without_ext = NULL; + name_without_ext = g_strdup(ap->mf_FileOperation.to_rename->str); + mf_file_attr_get_file_ext(ap->mf_FileOperation.to_rename->str, &ext); + mf_debug("ext is %s", ext); + if (ext && strlen(ext) != 0) { + mf_debug(); + name_without_ext[strlen(name_without_ext) - strlen(ext) - 1] = '\0'; + ap->mf_FileOperation.file_name_suffix = strdup(ext); + mf_debug("name_without_ext is [%s]\n", name_without_ext); + if (strlen(name_without_ext)) { + guide_text = elm_entry_utf8_to_markup(ecore_file_file_get(name_without_ext)); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + SAFE_FREE_CHAR(ext); + SAFE_FREE_CHAR(name_without_ext); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + if (ap->mf_FileOperation.file_name_suffix) { + limit_filter_data.max_char_count = (MYFILE_FILE_NAME_LEN_MAX - mf_util_character_count_get(ap->mf_FileOperation.file_name_suffix) - 1); + } else { + limit_filter_data.max_char_count = MYFILE_FILE_NAME_LEN_MAX; + } + + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(ap->mf_MainWindow.pEntry, elm_entry_filter_limit_size, &limit_filter_data); + + + elm_entry_entry_set(ap->mf_MainWindow.pEntry, guide_text); + /*elm_entry_entry_set(entry, ecore_file_file_get(params->m_ItemName->str));*/ + elm_entry_cursor_end_set(entry); + + SAFE_FREE_CHAR(guide_text); + SAFE_FREE_GSTRING(filename); + + //evas_object_smart_callback_add(entry, "activated", mf_genlist_rename_done, ap); + evas_object_smart_callback_add(entry, "changed", mf_callback_imf_changed_cb, ap); + evas_object_smart_callback_add(entry, "maxlength,reached", mf_callback_max_len_reached_cb, ap); + evas_object_smart_callback_add(entry, "preedit,changed", + mf_callback_imf_preedit_change_cb, ap); + elm_object_signal_callback_add(edit_field, "elm,eraser,clicked", "elm", mf_callback_eraser_clicked_cb, entry); + evas_object_show(entry); + elm_object_focus_set(entry, EINA_TRUE); + return edit_field; + } + return NULL; +} + +/** delete related **/ +static void __mf_genlist_gl_del(void *data, Evas_Object * obj) +{ + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + assert(params); + if (params->ap->mf_Status.more == MORE_RENAME) { + if (params->item == params->ap->mf_FileOperation.rename_item) { + mf_callback_destory_rename(params->ap); + } + } + if (params->m_ItemName) { + g_string_free(params->m_ItemName, TRUE); + params->m_ItemName = NULL; + } + if (params->thumb_path) { + free(params->thumb_path); + params->thumb_path = NULL; + } + if (params->create_date) { + free(params->create_date); + params->create_date = NULL; + } + if (params->size) { + free(params->size); + params->size = NULL; + } + if (params->flagExpand) { + params->flagExpand = false; + } + if (params->media) { + media_info_cancel_thumbnail(params->media); + media_info_destroy(params->media); + params->media = NULL; + } + free(params); + MF_TRACE_END; + return; +} + +/** state related **/ +static Eina_Bool __mf_genlist_gl_state_get(void *data, Evas_Object * obj, const char *part) +{ + return EINA_FALSE; +} + +/** select related **/ +/** this function will be splited into several functions **/ +void mf_genlist_gl_selected(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + + elm_genlist_item_selected_set(item, FALSE); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + if (ap->mf_Status.more == MORE_RENAME) { + if (elm_genlist_item_flip_get(item)) { + MF_TRACE_END; + return; + } else { + mf_callback_rename_save_cb(ap, NULL, NULL); + return; + } + } else if (ap->mf_Status.more != MORE_EDIT && ap->mf_Status.more != MORE_SHARE_EDIT) { +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_split_view_left_genlist_refresh(ap); + } +#endif + mf_callback_click_cb(data, MFACTION_CLICK, selected->m_ItemName); + } + } + MF_TRACE_END; +} +#ifdef MYFILE_SPLIT_VIEW + +static void mf_genlist_split_left_items_sel(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(event_info); + elm_genlist_item_selected_set(event_info, EINA_FALSE); + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + Eina_Bool expanded = EINA_FALSE; + if (event_info) { + expanded = elm_genlist_item_expanded_get(event_info); + selected->flagExpand = !expanded; + mf_error("selected->flagExpand is [%d]", selected->flagExpand); + elm_object_item_data_set(selected->item, selected); + elm_genlist_item_fields_update(selected->item, "elm.icon", ELM_GENLIST_ITEM_FIELD_CONTENT); + elm_genlist_item_expanded_set(event_info, !expanded); + } + MF_TRACE_END; +} + +Elm_Object_Item *mf_genlist_split_left_items_append( void *data, Evas_Object *pGenlist, Elm_Object_Item *parent_item, Eina_List *dir_list) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "input parameter data error"); + + mf_retvm_if(pGenlist == NULL, NULL, "input parameter pGenlist error"); + mf_retvm_if(parent_item == NULL, NULL, "input parameter parent_item error"); + + fsNodeInfo *pNode = NULL; + mfItemData_s *m_TempItem = NULL; + Eina_List *l = NULL; + Elm_Object_Item *expand = NULL; + + int real_len = 0; + int current_len = 0; + bool flagExpand = false; + + EINA_LIST_FOREACH(dir_list, l, pNode) { + char *real_name = NULL; + real_name = g_strconcat(pNode->path, "/", pNode->name, NULL); + if (real_name == NULL) { + continue; + } + + m_TempItem = (mfItemData_s *) malloc(sizeof(mfItemData_s)); + if (m_TempItem == NULL) { + free(real_name); + real_name = NULL; + continue; + } + + + Elm_Object_Item *it = NULL; + m_TempItem->m_ItemName = g_string_new(real_name); + m_TempItem->size = NULL; + m_TempItem->create_date = NULL; + m_TempItem->m_checked = FALSE; + m_TempItem->pCheckBox = NULL; + m_TempItem->thumb_path = NULL; + m_TempItem->flagExpand = false; + m_TempItem->real_thumb_flag = FALSE; + m_TempItem->unregister_lang_mgr = TRUE; + m_TempItem->media = NULL; + m_TempItem->ap = ap; + + if (ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + char *tempdate = mf_util_icu_translate(ap, pNode->date); + if (tempdate == NULL) + m_TempItem->create_date = g_strdup("N/A"); + else { + m_TempItem->create_date = g_strdup(tempdate); + free(tempdate); + } + + } + + it = elm_genlist_item_append(pGenlist, &left_itc, m_TempItem, parent_item, ELM_GENLIST_ITEM_TREE, mf_genlist_split_left_items_sel, ap); + real_len = strlen(real_name); + current_len = strlen(ap->mf_Status.path->str); + if (real_len > current_len && !flagExpand) { + expand = NULL; + } else { + if (strncmp(real_name, ap->mf_Status.path->str, strlen(real_name)) == 0) { + mf_debug("real_name is [%s] currnet path is [%s]", real_name, ap->mf_Status.path->str); + expand = it; + flagExpand = true; + } + } + m_TempItem->item = it; + free(real_name); + } + MF_TRACE_END; + return expand; +} + + +Elm_Object_Item *mf_genlist_split_root_item_append(void *data, Evas_Object *pGenlist, const char *name) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "input parameter data error"); + mf_retvm_if(pGenlist == NULL, NULL, "input parameter pGenlist error"); + + struct appdata *ap = (struct appdata *)data; + + mfItemData_s *m_TempItem = NULL; + Elm_Object_Item *it = NULL; + + mf_genlist_data_init(ap, &m_TempItem, name); + m_TempItem->unregister_lang_mgr = TRUE; + + it = elm_genlist_item_append(pGenlist, &left_itc, m_TempItem, NULL, ELM_GENLIST_ITEM_TREE, mf_genlist_split_left_items_sel, ap); + + m_TempItem->item = it; + return it; +} + +void mf_genlist_split_root_items_append(Evas_Object *pGenlist, void *data) +{ + MF_TRACE_BEGIN; + /*0. variable definition and parameter check*/ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + mf_retm_if(pGenlist == NULL, "input parameter pGenlist error"); + + /*4. append items to the genlist*/ + Elm_Object_Item *it = NULL; + + //mf_genlist_data_init(ap, &m_TempItem, PHONE_FOLDER); + + it = mf_genlist_split_root_item_append(ap, pGenlist, PHONE_FOLDER); + //it = elm_genlist_item_append(pGenlist, &left_itc, m_TempItem, NULL, ELM_GENLIST_ITEM_NONE, mf_genlist_gl_sel, m_TempItem); + + //m_TempItem->item = it; + ap->mf_MainWindow.sSplitData.phone_item = it; + + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + it = mf_genlist_split_root_item_append(ap, pGenlist, MEMORY_FOLDER); + ap->mf_MainWindow.sSplitData.mmc_item = it; + + } + + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + + it = mf_genlist_split_root_item_append(ap, pGenlist, OTG_FOLDER); + ap->mf_MainWindow.sSplitData.otg_item = it; + + } + MF_TRACE_END; + +} + +void mf_genlist_split_left_genlist_style(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + left_itc.item_style = "1text.2/expandable_n_depth"; + left_itc.func.text_get = __mf_genlist_gl_label_get; + left_itc.func.content_get = __mf_genlist_gl_default_icon_get; + left_itc.func.state_get = __mf_genlist_gl_state_get; + left_itc.func.del = __mf_genlist_gl_del; + + elm_genlist_decorate_mode_set(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist, EINA_FALSE); + +} + +#endif +/** edit mode related **/ +void mf_genlist_gl_sel(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mfItemData_s *selected = data; + + struct appdata *ap = (struct appdata *)selected->ap; + mf_retm_if(ap == NULL, "input parameter data error"); + + if (ap->mf_Status.more != MORE_EDIT && ap->mf_Status.more != MORE_SHARE_EDIT) { + return; + } + + Evas_Object *genlist = elm_object_item_widget_get(selected->item); + + if (genlist && elm_genlist_decorate_mode_get(genlist)) { + + selected->m_checked = !selected->m_checked; + if (selected->m_checked) { + ap->mf_MainWindow.pEditView.iCheckedCount++; + } else { + ap->mf_MainWindow.pEditView.iCheckedCount--; + } + //if (ap->mf_MainWindow.pEditView.pSelectAllCheckBox) { + if (ap->mf_MainWindow.pEditView.iTotalCount == ap->mf_MainWindow.pEditView.iCheckedCount) { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_TRUE; + } else { + ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_FALSE; + } + //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked); + //} + elm_genlist_item_fields_update(selected->item, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT); + } + mf_genlist_gl_edit_item_selected(ap); + MF_TRACE_END; +} + +void mf_genlist_genlist_item_select(void *data, Evas_Object *pGenlist, int *file_count, int *dir_count) +{ + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pGenlist == NULL, "pGenlist is NULL"); + + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + //int error_code = 0; + it = elm_genlist_first_item_get(pGenlist); + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_checked) { + if (itemData->m_ItemName == NULL || itemData->m_ItemName->str == NULL) { + continue; + } + if (mf_file_attr_is_dir(itemData->m_ItemName->str)) { + //bool systemfolder = FALSE; + ap->mf_Status.flagFolderSelect = TRUE; + (*dir_count)++; + } else { + ap->mf_Status.flagFileSelect = TRUE; + (*file_count)++; + } + } + + it = elm_genlist_item_next_get(it); + + } + MF_TRACE_END; +} + +void mf_genlist_gl_edit_item_selected(void *data) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.more != MORE_EDIT && ap->mf_Status.more != MORE_SHARE_EDIT) + return; + Evas_Object *notify_popup = NULL; + char *label = NULL; + int count_dir = 0; + int count_file = 0; + + ap->mf_Status.flagFolderSelect = FALSE; + ap->mf_Status.flagFileSelect = FALSE; + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + Evas_Object *pGenlist = ap->mf_MainWindow.pEditView.pGenlist; + mf_genlist_genlist_item_select(ap, pGenlist, &count_file, &count_dir); + + } else { + Evas_Object *pGengrid = ap->mf_MainWindow.pEditView.pGengrid; + mf_gengrid_item_select(ap, pGengrid, &count_file, &count_dir); + } + + if (ap->mf_Status.flagFolderSelect) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, true); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_USER_FOLDER_SEL, false); + } else if (ap->mf_Status.flagFileSelect){ + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, false); + } else { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, true); + } + + char lable_file[MYFILE_LABEL_STRING_LENGTH] = { '\0', }; + int count = 0; + /*1 TODO: need to update for multi-language*/ + count = count_file + count_dir; + snprintf(lable_file, sizeof(lable_file), "%d", (count)); + label = g_strconcat(GET_SYS_STR(MF_LABEL_SELECTED), " (", lable_file, ")", NULL); + + if (count > 0) { + notify_popup = mf_widget_create_notify_popup(ap, ap->mf_MainWindow.pNaviLayout, label, mf_notify_popup_normal, true, NULL); + ap->mf_MainWindow.pLabelLayout = notify_popup; + }else { + SAFE_FREE_OBJ(ap->mf_MainWindow.pLabelLayout); + } + SAFE_FREE_CHAR(label); +} + + +/** button related **/ + + +static inline void __mf_genlist_get_thumbnail(mfItemData_s *params) +{ + int error_code = 0; + if (params->thumb_path == NULL) { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + if (params->ap->mf_Status.view_type == mf_view_root) { + params->thumb_path = strdup(MF_ICON_FOLDER); + } else if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) { + params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE); + } else { + if (params->flagExpand == true) { + params->thumb_path = strdup(MF_ICON_FOLDER_OPEN); + } else { + params->thumb_path = strdup(MF_ICON_FOLDER); + } + } + params->real_thumb_flag = TRUE; + } else { + const char *icon_path = NULL; + int thumbnail_type = 0; + thumbnail_type = mf_file_attr_get_file_icon(params->m_ItemName->str, &error_code, MF_ROTATE_PORTRAIT, &icon_path, ¶ms->media); + if (icon_path && ecore_file_exists(icon_path)) { + params->thumb_path = strdup(icon_path); + params->real_thumb_flag = TRUE; + } else { /*must be image/video file*/ + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + + if (type == FILE_TYPE_VIDEO) { + params->thumb_path = strdup(MF_ICON_VIDEO); + } else if (type == FILE_TYPE_IMAGE) { + params->thumb_path = strdup(MF_ICON_IMAGE); + } else { + params->thumb_path = strdup(DEFAULT_ICON); + } + params->real_thumb_flag = FALSE; + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + } + } else if (params->thumb_path && ecore_file_exists(params->thumb_path)) { + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) { + params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE); + } else { + if (params->flagExpand == true) { + params->thumb_path = strdup(MF_ICON_FOLDER_OPEN); + } else { + params->thumb_path = strdup(MF_ICON_FOLDER); + } + } + } + if (params->real_thumb_flag == FALSE) { + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + } else if (!ecore_file_exists(params->thumb_path)) { + + { + mf_error("thumb_path[%s] is not exist", params->thumb_path); + free(params->thumb_path); + params->thumb_path = NULL; + + fsFileType type = FILE_TYPE_NONE; + type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str); + if (mf_file_attr_is_dir(params->m_ItemName->str)) { + if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) { + params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE); + } else { + if (params->flagExpand == true) { + params->thumb_path = strdup(MF_ICON_FOLDER_OPEN); + } else { + params->thumb_path = strdup(MF_ICON_FOLDER); + } + } + + } else { + if (type == FILE_TYPE_VIDEO) { + params->thumb_path = strdup(MF_ICON_VIDEO); + } else if (type == FILE_TYPE_IMAGE) { + params->thumb_path = strdup(MF_ICON_IMAGE); + } else { + params->thumb_path = strdup(DEFAULT_ICON); + } + } + /*set default icon*/ + params->real_thumb_flag = FALSE; + error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED; + } + } + if (error_code != 0) { + mf_callback_create_thumbnail(params, mf_callback_thumb_created_cb); + } +} + + +void mf_genlist_update_edit_view_item_style(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + userfolderitc.decorate_item_style = NULL; + userfolderitc.func.text_get = __mf_genlist_gl_label_get; + userfolderitc.func.content_get = __mf_genlist_gl_edit_icon_get; + userfolderitc.func.del = __mf_genlist_gl_del; + userfolderitc.decorate_all_item_style = "edit_default"; + + itc.decorate_item_style = NULL; + itc.func.text_get = __mf_genlist_gl_label_get; + itc.func.content_get = __mf_genlist_gl_edit_icon_get; + itc.func.del = __mf_genlist_gl_del; + itc.decorate_all_item_style = "edit_default"; + + categoryitc.decorate_item_style = NULL; + categoryitc.func.text_get = __mf_genlist_gl_label_get; + categoryitc.func.content_get = __mf_genlist_gl_edit_icon_get; + categoryitc.func.del = __mf_genlist_gl_del; + categoryitc.decorate_all_item_style = "edit_default"; + +} + + +void mf_genlist_set_category_list_style() +{ + categoryitc.item_style = "2text.2icon.4"; + categoryitc.decorate_item_style = "mode/slide2"; + categoryitc.func.text_get = __mf_genlist_gl_label_get; + categoryitc.func.content_get = __mf_genlist_gl_default_icon_get; + categoryitc.func.state_get = __mf_genlist_gl_state_get; + categoryitc.func.del = __mf_genlist_gl_del; + categoryitc.decorate_all_item_style = "edit_default"; +} +void mf_genlist_data_init(void *data, mfItemData_s **itemData, const char *item_name) +{ + + MF_TRACE_BEGIN; + /*0. variable definition and parameter check*/ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + + *itemData = (mfItemData_s *)malloc(sizeof(mfItemData_s)); + if (*itemData == NULL) { + mf_debug("itemData malloc failed"); + } else { + memset(*itemData, 0, sizeof(mfItemData_s)); + if (item_name) { + (*itemData)->m_ItemName = g_string_new(item_name); + } else { + (*itemData)->m_ItemName = NULL; + } + (*itemData)->m_checked = false; + (*itemData)->size = NULL; + (*itemData)->create_date = NULL; + (*itemData)->thumb_path = 0; + (*itemData)->pCheckBox = NULL; + (*itemData)->item = NULL; + (*itemData)->real_thumb_flag = false; + (*itemData)->flagExpand = false; + (*itemData)->media = NULL; + (*itemData)->ap = ap; + } +} + + +void mf_genlist_update_default_view_item_style(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + categoryitc.decorate_item_style = userfolderitc.decorate_item_style = itc.decorate_item_style = "mode/slide"; + categoryitc.func.text_get = userfolderitc.func.text_get = itc.func.text_get = __mf_genlist_gl_label_get; + categoryitc.func.content_get = userfolderitc.func.content_get = itc.func.content_get = __mf_genlist_gl_default_icon_get; + categoryitc.func.state_get = userfolderitc.func.state_get = itc.func.state_get = __mf_genlist_gl_state_get; + categoryitc.func.del = userfolderitc.func.del = itc.func.del = __mf_genlist_gl_del; + + elm_genlist_decorate_mode_set(ap->mf_MainWindow.pNaviGenlist, EINA_FALSE); +} + +void mf_genlist_create_search_itc() +{ + MF_TRACE_BEGIN; + search_itc.item_style = "2text.1icon.4.tb"; + search_itc.decorate_item_style = "mode/slide"; + search_itc.func.text_get = __mf_genlist_gl_label_get; + search_itc.func.content_get = __mf_genlist_gl_default_icon_get; + search_itc.func.state_get = __mf_genlist_gl_state_get; + search_itc.func.del = __mf_genlist_gl_del; + search_itc.decorate_all_item_style = "edit_default"; + +} + + +void mf_genlist_create_data(mfItemData_s **m_TempItem, const char *name, void *data) +{ + mf_retm_if(m_TempItem == NULL, "m_TempItem is NULL"); + mf_retm_if(name == NULL, "name is NULL"); + + *m_TempItem = (mfItemData_s *) calloc(1, sizeof(mfItemData_s)); + if (*m_TempItem == NULL) { + return; + } + + (*m_TempItem)->m_ItemName = g_string_new(name); + (*m_TempItem)->size = NULL; + (*m_TempItem)->create_date = NULL; + (*m_TempItem)->m_checked = FALSE; + (*m_TempItem)->pCheckBox = NULL; + (*m_TempItem)->thumb_path = NULL; + (*m_TempItem)->real_thumb_flag = FALSE; + (*m_TempItem)->media = NULL; + (*m_TempItem)->ap = (struct appdata *)data; + +} + +void mf_genlist_set_folder_edit_style() +{ + userfolderitc.decorate_all_item_style = NULL; +} + +void mf_genlist_create_list_default_style(Evas_Object *pGenlist, void *data, Eina_List *dir_list, + Eina_List *file_list) +{ + MF_TRACE_BEGIN; + /*0. variable definition and parameter check*/ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input parameter data error"); + + mf_retm_if(pGenlist == NULL, "input parameter pGenlist error"); + /*0.5. data list varaible set*/ + /*1. item style set */ + MF_TA_ACUM_ITEM_BEGIN(" init genlist item class", 0); + + userfolderitc.decorate_all_item_style = "edit_default"; + itc.decorate_all_item_style = "edit_default"; + + if (ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + userfolderitc.item_style = itc.item_style = "3text.1icon.1"; + + } else { + userfolderitc.item_style = itc.item_style = "1text.1icon.2"; + + } + if (ap->mf_Status.view_type == mf_view_root) { + } else { + userfolderitc.decorate_item_style = itc.decorate_item_style = "mode/slide2"; + } + userfolderitc.func.text_get = itc.func.text_get = __mf_genlist_gl_label_get; + userfolderitc.func.content_get = itc.func.content_get = __mf_genlist_gl_default_icon_get; + userfolderitc.func.state_get = itc.func.state_get = __mf_genlist_gl_state_get; + userfolderitc.func.del = itc.func.del = __mf_genlist_gl_del; + + MF_TA_ACUM_ITEM_END(" init genlist item class", 0); + /*3. check if we need give no content view*/ + /*4. append items to the genlist*/ + fsNodeInfo *pNode = NULL; + Eina_List *l = NULL; + + MF_TA_ACUM_ITEM_BEGIN(" append genlist items", 0); + + mf_debug("dir_list count is [%d] file is [%d]", eina_list_count(dir_list), eina_list_count(file_list)); + /* add default folder items into the genlist */ + EINA_LIST_FOREACH(dir_list, l, pNode) { + mf_widget_item_append(pGenlist, pNode, ap); + } + /* add file items into the genlist */ + mf_debug("view_type is [%d]", ap->mf_Status.view_type); + if (ap->mf_Status.view_type != mf_view_root) { + EINA_LIST_FOREACH(file_list, l, pNode) { + mf_widget_item_append(pGenlist, pNode, ap); + } + } + MF_TA_ACUM_ITEM_END(" append genlist items", 0); + MF_TRACE_BEGIN; +} + +Evas_Object *mf_genlist_create_list(void *data,Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + struct appdata *ap = (struct appdata *)data; + Evas_Object *genlist = NULL; + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + + /* generate raw data list*/ + + if (ap->mf_Status.view_type == mf_view_root_category) { + file_list = ap->mf_FileOperation.category_list; + } else { + file_list = ap->mf_FileOperation.file_list; + dir_list = ap->mf_FileOperation.folder_list; + } + +/* create Genlist*/ + MF_TA_ACUM_ITEM_BEGIN(" create genlist", 0); + genlist = mf_widget_create_genlist(parent); + if (genlist == NULL) { + return NULL; + } + MF_TA_ACUM_ITEM_END(" create genlist", 0); + mf_debug("More is [%d]", ap->mf_Status.more); + switch (ap->mf_Status.more) { + MF_TA_ACUM_ITEM_BEGIN(" register smart callback for genlist", 0); + case MORE_DEFAULT: + evas_object_smart_callback_add(genlist, "drag,start,right", mf_genlist_gl_mode_sweep_set, ap); + evas_object_smart_callback_add(genlist, "drag,start,left", mf_genlist_gl_mode_sweep_unset, ap); + evas_object_smart_callback_add(genlist, "drag,start,up", mf_genlist_gl_mode_cancel, ap); + evas_object_smart_callback_add(genlist, "drag,start,down", mf_genlist_gl_mode_cancel, ap); + case MORE_INTERNAL_COPY: + case MORE_INTERNAL_MOVE: + case MORE_INTERNAL_COPY_MOVE: + case MORE_DATA_COPYING: + case MORE_DATA_MOVING: + evas_object_smart_callback_add(genlist, "selected", mf_genlist_gl_selected, ap); + MF_TA_ACUM_ITEM_END(" register smart callback for genlist", 0); + mf_genlist_create_list_default_style(genlist, ap, dir_list, file_list); + break; + default: + break; + } +/*4. add watcher:*/ +/*5. clear temporary data*/ + MF_TRACE_END; + return genlist; +} + +void mf_genlist_get_list_selected_files(Evas_Object * pGenlist, Eina_List **list) +{ + MF_TRACE_BEGIN; + mf_retm_if(pGenlist == NULL, "pGenlist is NULL"); + Elm_Object_Item *item = NULL; + mfItemData_s *itemData = NULL; + GString *pTemp = NULL; + + item = elm_genlist_first_item_get(pGenlist); + while (item) { + itemData = elm_object_item_data_get(item); + if (itemData->m_checked) { + pTemp = g_string_new(itemData->m_ItemName->str); + *list = eina_list_append(*list, pTemp); + } + item = elm_genlist_item_next_get(item); + } + MF_TRACE_END; +} + +void mf_genlist_get_list_selected_items(Evas_Object * pGenlist, Eina_List **list) +{ + MF_TRACE_BEGIN; + mf_retm_if(pGenlist == NULL, "pGenlist is NULL"); + Elm_Object_Item *item = NULL; + mfItemData_s *itemData = NULL; + + item = elm_genlist_first_item_get(pGenlist); + while (item) { + itemData = elm_object_item_data_get(item); + if (itemData->m_checked) { + *list = eina_list_append(*list, itemData); + } + item = elm_genlist_item_next_get(item); + } + MF_TRACE_END; +} + +Evas_Object *mf_genlist_create_list_new_folder_style(void *data) +{ + + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + Evas_Object *genlist = NULL; + Evas_Object *pNaviBar = NULL; + + pNaviBar = ap->mf_MainWindow.pNaviBar; + + genlist = elm_genlist_add(pNaviBar); + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + elm_object_focus_set(genlist, EINA_FALSE); + + newfolderitc.item_style = "dialogue/bg/1icon"; + newfolderitc.func.text_get = NULL; + newfolderitc.func.content_get = __mf_genlist_gl_new_folder_icon_get; + newfolderitc.func.state_get = NULL; + newfolderitc.func.del = NULL; + + elm_genlist_item_append(genlist, &newfolderitc, ap, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + return genlist; +} + +Evas_Object *mf_genlist_create_list_rename_style(void *data) +{ + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + Evas_Object *genlist = NULL; + Evas_Object *pNaviBar = NULL; + + pNaviBar = ap->mf_MainWindow.pNaviBar; + + genlist = elm_genlist_add(pNaviBar); + + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + elm_object_focus_set(genlist, EINA_FALSE); + + newfolderitc.item_style = "dialogue/bg/1icon"; + newfolderitc.func.text_get = NULL; + newfolderitc.func.content_get = __mf_genlist_gl_rename_icon_get; + newfolderitc.func.state_get = NULL; + newfolderitc.func.del = NULL; + + elm_genlist_item_append(genlist, &newfolderitc, ap, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + return genlist; +} + + +void mf_genlist_clear(Evas_Object *genlist) +{ + assert(genlist); + + Elm_Object_Item *it; + it = elm_genlist_first_item_get(genlist); + while (it) { + elm_object_item_del(it); + it = elm_genlist_first_item_get(genlist); + } + +} + +void mf_genlist_sweep_item_recover(Evas_Object *obj) +{ + + mf_retm_if(obj == NULL, "obj is NULL"); + Elm_Object_Item *it = (Elm_Object_Item *) elm_genlist_decorated_item_get(obj); + + /* Finish genlist sweep*/ + if (it) { + elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE); + elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT); + elm_genlist_item_update(it); + } + +} + +static char *__get_title_gl_text(void *data, Evas_Object *obj, const char *part) +{ + MF_TRACE_BEGIN; + if (data) + return g_strdup((char *)data); + else + return NULL; +} +static void __del_title_gl(void *data, Evas_Object * obj) +{ + SAFE_FREE_CHAR(data); +} + +Evas_Object *mf_genlist_create_path_info(Evas_Object *parent, char *info) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *genlist = NULL; + Elm_Object_Item *git=NULL; + + genlist = elm_genlist_add(parent); + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + + itch.item_style = "groupindex"; + itch.func.text_get = __get_title_gl_text; + itch.func.del = __del_title_gl; + + git = elm_genlist_item_append(genlist, &itch, info, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + MF_TRACE_END; + + return genlist; +} diff --git a/src/widget/mf-navi-bar.c b/src/widget/mf-navi-bar.c new file mode 100644 index 0000000..faf3759 --- /dev/null +++ b/src/widget/mf-navi-bar.c @@ -0,0 +1,2039 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "mf-widget.h" +#include "mf-callback.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-gengrid.h" +#include "mf-util.h" +#include "mf-ta.h" +#include "mf-resource.h" +#include "mf-language-mgr.h" +#include "mf-tray-item.h" + +void __mf_navi_bar_reset_navi_obj(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + ap->mf_MainWindow.pNaviBox = NULL; + ap->mf_MainWindow.pNaviInfoBox = NULL; + ap->mf_MainWindow.pTrayBox = NULL; + +} +Evas_Object *__mf_navi_bar_get_upper_genlist(Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + Evas_Object *upper_layout = NULL; + Evas_Object *upper_genlist = NULL; + + upper_layout = mf_navi_bar_get_box_end(parent); + mf_retvm_if(upper_layout == NULL, NULL, "upper_layout is NULL"); + + upper_genlist = elm_object_part_content_get(upper_layout, "upper"); + mf_retvm_if(upper_genlist == NULL, NULL, "upper_genlist is NULL"); + MF_TRACE_END; + return upper_genlist; +} + +Evas_Object *mf_navi_bar_create_navi_bar(Evas_Object * parent) +{ + Evas_Object *navi_bar; + assert(parent); + navi_bar = elm_naviframe_add(parent); + elm_naviframe_prev_btn_auto_pushed_set(navi_bar, EINA_FALSE); + evas_object_show(navi_bar); + return navi_bar; +} + +/* external functions */ +/****************************** +** Prototype : mfNaviBarCreateView +** Description : +** Input : struct appdata* data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Evas_Object *mf_navi_bar_create_search_bar(Evas_Object * parent, void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retv_if(ap == NULL, NULL); + mf_retv_if(parent == NULL, NULL); + + Evas_Object *sb = NULL; + Evas_Object *en = NULL; + + sb = elm_layout_add(parent); + + elm_layout_theme_set(sb, "layout", "searchbar", "cancel_button"); + + Evas_Object *cancel_btn = elm_button_add(sb); + elm_object_style_set(cancel_btn, "searchbar/default"); + elm_object_text_set(cancel_btn, GET_SYS_STR(LABEL_CANCEL)); + mf_language_mgr_register_object(cancel_btn, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_CANCEL); + evas_object_smart_callback_add(cancel_btn, "clicked", mf_callback_cancel_cb, ap); + + elm_object_part_content_set(sb, "button_cancel", cancel_btn); + elm_object_signal_emit(sb, "cancel,show", ""); + elm_object_signal_emit(sb, "elm,state,eraser,show", "elm"); + + en = elm_entry_add(sb); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_cnp_mode_set(en, ELM_CNP_MODE_PLAINTEXT); + elm_object_part_content_set(sb, "elm.swallow.content", en); + evas_object_data_set(sb, "entry", en); + + elm_entry_input_panel_layout_set(en, ELM_INPUT_PANEL_LAYOUT_NORMAL); + + evas_object_size_hint_weight_set(sb, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(sb, EVAS_HINT_FILL, 0.0); + + evas_object_smart_callback_add(en, "maxlength,reached", mf_callback_max_len_reached_cb, ap); + evas_object_smart_callback_add(en, "changed", mf_callback_imf_changed_cb, ap); + evas_object_smart_callback_add(en, "activated", mf_search_bar_search_started_callback, ap); + + elm_object_signal_callback_add(sb, "elm,eraser,clicked", "elm", mf_callback_eraser_clicked_cb, en); + + static Elm_Entry_Filter_Limit_Size limit_filter_data; + limit_filter_data.max_char_count = 0; + limit_filter_data.max_byte_count = MYFILE_FILE_NAME_LEN_MAX; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + + evas_object_show(sb); + elm_object_focus_set(en, EINA_TRUE); + ap->mf_MainWindow.pSearchEntry = en; + return sb; + + +} + + + +Evas_Object *mf_navi_bar_get_edit_genlist(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retv_if(ap == NULL, NULL); + return ap->mf_MainWindow.pEditView.pGenlist; +} + +Evas_Object *mfNaviBarConformGet(void *data) +{ + mf_retv_if(data == NULL, NULL); + struct appdata *ap = (struct appdata *)data; + return ap->mf_MainWindow.pNaviLayout; +} + +Evas_Object *mf_navi_bar_get_box_end(Evas_Object * pBox) +{ + MF_TRACE_BEGIN; + mf_retvm_if(pBox == NULL, NULL, "pBox is NULL"); + Eina_List *pBoxChildren = NULL; + pBoxChildren = elm_box_children_get(pBox); + mf_retvm_if(pBoxChildren == NULL, NULL, "pBoxChildren is NULL"); + + int len = eina_list_count(pBoxChildren); + if (len > 0) { + MF_TRACE_END; + return eina_list_nth(pBoxChildren, len - 1); + } + MF_TRACE_END; + return NULL; +} + +/****************************** +** Prototype : mfNaviBarSetSegment +** Description : +** Input : struct appdata* data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_navi_bar_set_ctrl_bar(struct appdata *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + Evas_Object *NaviBar = ap->mf_MainWindow.pNaviBar; + mf_retm_if(NaviBar == NULL, "Navi bar is NULL"); + Evas_Object *pCtrlBar = NULL; + + pCtrlBar = mf_ctrl_bar_create(ap, NaviBar); + mf_retm_if(pCtrlBar == NULL, "mf_ctrl_bar_create failed"); + + ap->mf_MainWindow.pNaviCtrlBar = pCtrlBar; + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, CTRL_STYLE_TYPE, pCtrlBar); + + evas_object_show(pCtrlBar); + MF_TRACE_END; +} + + +Evas_Object *mf_navi_bar_content_create(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retvm_if(pNavi_s == NULL, NULL, "pNavi_s is NULL"); + mf_retvm_if(ap->mf_Status.path == NULL, NULL, "ap->mf_Status.path is NULL"); + mf_retvm_if(ap->mf_Status.path->str == NULL, NULL, "ap->mf_Status.path->str is NULL"); + + Evas_Object *pContent = NULL; + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + int dir_list_len = 0; + int file_list_len = 0; + int error_code = 0; + + if (ap->mf_Status.view_type == mf_view_root) { + if (ap->mf_FileOperation.folder_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.folder_list), MYFILE_TYPE_FSNODE); + } + if (ap->mf_FileOperation.file_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.file_list), MYFILE_TYPE_FSNODE); + } + + mf_util_generate_root_view_file_list(ap, &(ap->mf_FileOperation.folder_list), ap->mf_Status.iStorageState); + ap->mf_Status.flagNoContent = EINA_FALSE; + mf_debug("count is [%d]", eina_list_count(ap->mf_FileOperation.folder_list)); + } else if (ap->mf_Status.view_type == mf_view_root_category) { + if (eina_list_count(ap->mf_FileOperation.category_list) > 0) { + ap->mf_Status.flagNoContent = EINA_FALSE; + mf_util_sort_the_file_list(ap); + } else { + ap->mf_Status.flagNoContent = EINA_TRUE; + } + } else { + mf_error(); + MF_TA_ACUM_ITEM_BEGIN(" mf_util_generate_file_list", 0); + error_code = mf_util_generate_file_list(ap); + MF_TA_ACUM_ITEM_END(" mf_util_generate_file_list", 0); + if (error_code != MYFILE_ERR_NONE) { + /*Todo: we need to free all the Eina_List*/ + return NULL; + } + MF_TA_ACUM_ITEM_BEGIN(" mf_util_sort_the_file_list", 0); + + /* sort the list by sort_type*/ + mf_util_sort_the_file_list(ap); + MF_TA_ACUM_ITEM_END(" mf_util_sort_the_file_list", 0); + + MF_TA_ACUM_ITEM_BEGIN(" No content check", 0); + file_list = ap->mf_FileOperation.file_list; + dir_list = ap->mf_FileOperation.folder_list; + + dir_list_len = eina_list_count(dir_list); + file_list_len = eina_list_count(file_list); + + if ((dir_list_len + file_list_len) > 0) { + ap->mf_Status.flagNoContent = EINA_FALSE; + } else { + ap->mf_Status.flagNoContent = EINA_TRUE; + } + MF_TA_ACUM_ITEM_END(" No content check", 0); + } + ap->mf_MainWindow.pNaviGenlist = NULL; + ap->mf_MainWindow.pNaviGengrid = NULL; + + if (ap->mf_Status.flagNoContent) { + MF_TA_ACUM_ITEM_BEGIN(" No content create", 0); + pContent = mf_widget_create_no_content(ap->mf_MainWindow.pNaviBar); + MF_TA_ACUM_ITEM_END(" No content create", 0); + } else { + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_THUMBNAIL) { + pContent = mf_gengrid_create_list(ap, ap->mf_MainWindow.pNaviBar); + ap->mf_MainWindow.pNaviGengrid = pContent; + } else { + MF_TA_ACUM_ITEM_BEGIN(" genlist view create", 0); + pContent = mf_genlist_create_list(ap, ap->mf_MainWindow.pNaviBar); + MF_TA_ACUM_ITEM_END(" genlist view create", 0); + ap->mf_MainWindow.pNaviGenlist = pContent; + } + } + if (ap->mf_Status.more == MORE_DEFAULT) { + MF_TA_ACUM_ITEM_BEGIN(" Add dir monitor", 0); + mf_callback_add_dir_watch(ap->mf_Status.path->str, ap); + MF_TA_ACUM_ITEM_END(" Add dir monitor", 0); + } + + MF_TRACE_END; + return pContent; + +} +/****************************** +** Prototype : mfNaviBarSetContent +** Description : +** Input : Evas_Object *pLayout +** Evas_Object *NaviContent +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static int __mf_navi_bar_reset_content_idler(void *data) +{ + MF_TRACE_BEGIN; + + struct appdata *ap = (struct appdata *)data; + if (ap) { + SAFE_FREE_OBJ(ap->mf_Status.old_content); + ap->mf_Status.navi_content_idler = NULL; + } + MF_TRACE_END; + + return ECORE_CALLBACK_CANCEL; +} + +void mfNaviBarSetContent(void *data, Evas_Object *pLayout, Evas_Object *NaviContent) +{ + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pLayout == NULL, "pConform is NULL"); + mf_retm_if(NaviContent == NULL, "NaviContent is NULL"); + + struct appdata *ap = (struct appdata *)data; + Evas_Object *unUsed = mf_widget_unset_part_content(pLayout, "content"); + evas_object_hide(unUsed); + ap->mf_Status.old_content = unUsed; + mf_ecore_idler_del(ap->mf_Status.navi_content_idler); + ap->mf_Status.navi_content_idler = ecore_idler_add((Ecore_Task_Cb)__mf_navi_bar_reset_content_idler, ap); + /*if bs, use idler here*/ + elm_object_part_content_set(pLayout, "content", NaviContent); +} + +Evas_Object *mf_navi_bar_get_content(Evas_Object *pConform) +{ + return elm_object_content_get(pConform); +} + +/****************************** +** Prototype : mf_navi_bar_set_style +** Description : +** Input : struct appdata* data +** eNaviBarStyle navi_style +** Evas_Object *NaviContent +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +static void __mf_navi_bar_title(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + Evas_Object *pNavi = ap->mf_MainWindow.pNaviBar; + Elm_Object_Item *navi_it = ap->mf_MainWindow.pNaviItem; + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + + Evas_Object *unset = NULL; + int more = ap->mf_Status.more; + + Evas_Object *label = elm_label_add(pNavi); + // set the label style + elm_object_style_set(label, "naviframe_title"); + // set the label for the title slide mode + elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_AUTO); + elm_label_wrap_width_set(label, 1); + elm_label_ellipsis_set(label, EINA_TRUE); + // set the label text + if (more == MORE_EDIT) { + elm_object_text_set(label, GET_SYS_STR(MF_LABEL_EDIT)); + } else if (more == MORE_SHARE_EDIT) { + elm_object_text_set(label, GET_SYS_STR(LABEL_SHARE)); + } + else { + elm_object_text_set(label, pNavi_s->pNaviTitle); + } + evas_object_show(label); + unset = elm_object_item_part_content_unset(navi_it, "elm.swallow.title"); + SAFE_FREE_OBJ(unset); + elm_object_item_part_content_set(navi_it, "elm.swallow.title", label); + +} +void mf_navi_bar_title_set(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + int more = ap->mf_Status.more; + char *path = ap->mf_Status.path->str; + Elm_Object_Item *navi_it = ap->mf_MainWindow.pNaviItem; + Evas_Object *pNavi = ap->mf_MainWindow.pNaviBar; + Evas_Object *unset = NULL; + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + + if (ap->mf_Status.more == MORE_CREATE_FOLDER + || ap->mf_Status.more == MORE_THUMBNAIL_RENAME + || ap->mf_Status.more == MORE_SEARCH + || ap->mf_Status.more == MORE_EDIT + || ap->mf_Status.more == MORE_SHARE_EDIT) { + __mf_navi_bar_title(ap); + } else if (more != MORE_EDIT && more != MORE_SEARCH) { + if (ap->mf_Status.view_type != mf_view_root) { + Evas_Object *home_btn = elm_button_add(pNavi); + //elm_object_style_set(home_btn, TITLE_BTN_STYLE); + elm_object_style_set(home_btn, "naviframe/title_icon"); + Evas_Object *home_ic = elm_image_add(pNavi); + elm_image_file_set(home_ic, MF_TITLE_ICON_HOME, NULL); + elm_image_resizable_set(home_ic, EINA_TRUE, EINA_TRUE); + elm_object_content_set(home_btn, home_ic); + mf_language_mgr_register_object(home_btn, OBJ_TYPE_ELM_OBJECT, NULL, MF_LABEL_HOME); + evas_object_smart_callback_add(home_btn, "clicked", mf_callback_home_button_cb, ap); + evas_object_smart_callback_add(home_btn, "pressed", mf_callback_home_button_pressed_cb, home_ic); + evas_object_smart_callback_add(home_btn, "unpressed", mf_callback_home_button_unpressed_cb, home_ic); + evas_object_show(home_btn); + + unset = elm_object_item_part_content_unset(navi_it, TITLE_LEFT_BTN); + SAFE_FREE_OBJ(unset); + elm_object_item_part_content_set(navi_it, TITLE_LEFT_BTN, home_btn); + + Evas_Object *up_btn = elm_button_add(pNavi); + //elm_object_style_set(up_btn, TITLE_BTN_STYLE); + elm_object_style_set(up_btn, "naviframe/title_icon"); + Evas_Object *up_ic = elm_image_add(pNavi); + elm_image_file_set(up_ic, MF_TITLE_ICON_UPPER, NULL); + elm_image_resizable_set(up_ic, EINA_TRUE, EINA_TRUE); + elm_object_content_set(up_btn, up_ic); + mf_language_mgr_register_object(up_btn, OBJ_TYPE_ELM_OBJECT, NULL, MF_LABEL_UPPER); + evas_object_smart_callback_add(up_btn, "clicked", mf_callback_upper_click_cb, ap); + evas_object_smart_callback_add(up_btn, "pressed", mf_callback_upper_button_pressed_cb, up_ic); + evas_object_smart_callback_add(up_btn, "unpressed", mf_callback_upper_button_unpressed_cb, up_ic); + evas_object_show(up_btn); + unset = elm_object_item_part_content_unset(navi_it, TITLE_RIGHT_BTN); + SAFE_FREE_OBJ(unset); + elm_object_item_part_content_set(navi_it, TITLE_RIGHT_BTN, up_btn); + + } + __mf_navi_bar_title(ap); + + } + elm_naviframe_item_title_visible_set(navi_it, EINA_TRUE); + + MF_TRACE_END; + +} +void mf_navi_bar_set_style(void *data, eNaviBarStyle navi_style, Evas_Object *NaviContent) +{ + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + Evas_Object *NaviBar = ap->mf_MainWindow.pNaviBar; + mf_retm_if(NaviBar == NULL, "Navi bar is NULL"); + Evas_Object *pConform = ap->mf_MainWindow.pNaviLayout; + mf_retm_if(pConform == NULL, "Conformant is NULL"); + Evas_Object *l_button = ap->mf_MainWindow.pNaviLeftBtn; + Elm_Object_Item *navi_it = NULL; + + char *title = pNavi_s->pNaviTitle; + mfNaviBarSetContent(ap, pConform, NaviContent); + + switch (navi_style) { + case NAVI_BAR_DEFAULT: /*when MMC is off, show "myfile" only*/ + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + navi_it = elm_naviframe_item_push(NaviBar, NULL, NULL, NULL, pConform, MF_NAVI_STYLE_ENABLE); + + ap->mf_MainWindow.pNaviItem = navi_it; + break; + case NAVI_BAR_PATH_WITH_ONE_ACTION: + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + navi_it = elm_naviframe_item_push(NaviBar, NULL, l_button, NULL, pConform, MF_NAVI_STYLE_ENABLE); + ap->mf_MainWindow.pNaviItem = navi_it; + break; + default: + break; + } +} + + +/****************************** +** Prototype : __mf_navi_bar_select_count_label_timeout_cb +** Description : +** Input : void *data +** Evas_Object *obj +** void *event_info +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ + + + +void mf_navi_bar_set_upper_item_disable(void *data, bool bFlag) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + if (!mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + Elm_Object_Item *pUpperItem = NULL; + Evas_Object *upper_genlist = NULL; + + upper_genlist = __mf_navi_bar_get_upper_genlist(ap->mf_MainWindow.pNaviInfoBox); + pUpperItem = elm_genlist_first_item_get(upper_genlist); + if (pUpperItem) { + mfItemData_s *itemData = elm_object_item_data_get(pUpperItem); + + if (itemData && itemData->m_ItemName && itemData->m_ItemName->str + && g_strcmp0(itemData->m_ItemName->str, ap->mf_Status.upper_folder) == 0) { + elm_object_item_disabled_set(pUpperItem, bFlag); + } + } + } +} + +Evas_Object *__mf_navi_bar_backbutton_create(Evas_Object *parent, Evas_Object *win) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(win == NULL, NULL, "win is NULL"); + + Evas_Object *btn = NULL; + btn = elm_button_add(parent); + elm_object_style_set(btn, "naviframe/end_btn/default"); + evas_object_show(btn); + return btn; + +} +Evas_Object *mf_navi_bar_pathinfo_label_create(Evas_Object *parent, char *pathinfo) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(pathinfo == NULL, NULL, "pathinfo is NULL"); + Evas_Object *label = NULL; + + label = elm_label_add(parent); + elm_object_focus_set(label, EINA_FALSE); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(label, pathinfo); + evas_object_show(label); + SAFE_FREE_CHAR(pathinfo); + MF_TRACE_END; + return label; +} + +Evas_Object *__mf_navi_bar_pathinfo_create(Evas_Object *parent, const char *content) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(content == NULL, NULL, "content is NULL"); + + Evas_Object *layout = NULL; + + layout = elm_layout_add(parent); + elm_object_focus_set(layout, EINA_FALSE); + elm_layout_file_set(layout, EDJ_NAME, GRP_PATH_INFO); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + //elm_object_part_content_set(layout, "info", content); + elm_object_part_text_set(layout, "info", content); + evas_object_show(layout); + MF_TRACE_END; + return layout; +} + +void mf_navi_add_back_button(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + Evas_Object *pBackButton = NULL; + + pBackButton = __mf_navi_bar_backbutton_create(ap->mf_MainWindow.pNaviBar, ap->mf_MainWindow.pWindow); + if (pBackButton) { + Evas_Object *unset = elm_object_item_part_content_unset(ap->mf_MainWindow.pNaviItem, "prev_btn"); + SAFE_FREE_OBJ(unset); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, "prev_btn", pBackButton); + evas_object_smart_callback_add(pBackButton, "clicked", mf_callback_backbutton_clicked_cb, ap); + } +} + +void mf_navi_remove_home_upper_button(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.view_type != mf_view_root) { + Evas_Object *btn = NULL; + btn = elm_object_item_part_content_unset(ap->mf_MainWindow.pNaviItem, TITLE_LEFT_BTN); + SAFE_FREE_OBJ(btn); + btn = elm_object_item_part_content_unset(ap->mf_MainWindow.pNaviItem, TITLE_RIGHT_BTN); + SAFE_FREE_OBJ(btn); + } +} + +Evas_Object *mf_navi_bar_upper_create(Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *upper_genlist = NULL; + upper_genlist = elm_genlist_add(parent); + mf_retvm_if(upper_genlist == NULL, NULL, "upper_genlist is NULL"); + elm_object_focus_set(upper_genlist, EINA_FALSE); + evas_object_size_hint_weight_set(upper_genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(upper_genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_bounce_set(upper_genlist, EINA_FALSE, EINA_FALSE); + evas_object_show(upper_genlist); + MF_TRACE_END; + return upper_genlist; + +} + +void mf_navi_bar_remove_back_button(Elm_Object_Item *pNaviItem) +{ + MF_TRACE_BEGIN; + mf_retm_if(pNaviItem == NULL, "pNaviItem is NULL"); + Evas_Object *back_btn = NULL; + + back_btn = elm_object_item_part_content_get(pNaviItem, "prev_btn"); + if (back_btn != NULL) { + elm_object_item_part_content_unset(pNaviItem, "prev_btn"); + evas_object_hide(back_btn); + evas_object_del(back_btn); + } + MF_TRACE_END; +} + +Evas_Object *mf_navi_bar_create_header_box(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + Evas_Object *box = NULL; + Evas_Object *pathinfo_layout = NULL; + char *pathinfo = NULL; + char *info = NULL; + + if (!mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retvm_if(pNavi_s == NULL, NULL, "pNavi_s is NULL"); + + //box = mf_widget_create_box(ap->mf_MainWindow.pNaviBox); + //evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + //evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + //elm_box_clear(box); + + + + + pathinfo = mf_fm_svc_path_info_get(ap->mf_Status.path->str); + info = mf_fm_svc_path_info_translate(pathinfo, MF_PATH_INFO_MAX_LENGTH_PORTRAIT); + + + //Evas_Object *genlist = mf_genlist_create_path_info(box, info); + pathinfo_layout = __mf_navi_bar_pathinfo_create(ap->mf_MainWindow.pNaviBox, info); + evas_object_size_hint_weight_set(pathinfo_layout, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(pathinfo_layout, EVAS_HINT_FILL, 0.0); + //evas_object_show(genlist); + +#if 0 + upper_layout = elm_layout_add(box); + elm_object_focus_set(upper_layout, EINA_FALSE); + ret = elm_layout_file_set(upper_layout, EDJ_NAME, "upper_folder"); + evas_object_size_hint_weight_set(upper_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);//(upper_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(upper_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(upper_layout); + elm_box_pack_end(box, upper_layout); + +#endif + //elm_box_pack_start(box, pathinfo_layout); + evas_object_show(pathinfo_layout); + } + MF_TRACE_END; + return pathinfo_layout; +} + +void mf_navi_bar_set_ctrl_button(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *navi_it = ap->mf_MainWindow.pNaviItem; + Evas_Object *more_bt = NULL; + Evas_Object *bt_1 = NULL; + Evas_Object *bt_2 = NULL; + switch(ap->mf_Status.more) { + case MORE_DEFAULT: + more_bt = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_EDIT, MF_LABEL_MORE, NULL, mf_callback_more_button_cb, ap); + if (ap->mf_Status.view_type == mf_view_root) { + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, MF_LABEL_SEARCH, NULL, mf_search_bar_enter_search_routine, ap); + } else { + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, MF_LABEL_EDIT, NULL, mf_callback_edit_cb, ap); + bt_2 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_SHARE, NULL, mf_callback_edit_cb, ap); + } + break; + case MORE_EDIT: + more_bt = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_EDIT, MF_LABEL_MORE, NULL, mf_callback_more_button_cb, ap); + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_DELETE, NULL, mf_callback_delete_cb, ap); + //bt_2 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_SHARE, NULL, mf_callback_share_cb, ap); + break; + case MORE_INTERNAL_COPY: + case MORE_DATA_COPYING: + if (ap->mf_Status.view_type != mf_view_root) { + more_bt = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_EDIT, MF_LABEL_MORE, NULL, mf_callback_more_button_cb, ap); + } + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_COPY_HERE, NULL, mf_callback_paste_here_cb, ap); + break; + case MORE_INTERNAL_MOVE: + case MORE_DATA_MOVING: + if (ap->mf_Status.view_type != mf_view_root) { + more_bt = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_EDIT, MF_LABEL_MORE, NULL, mf_callback_more_button_cb, ap); + } + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_MOVE_HERE, NULL, mf_callback_move_here_cb, ap); + break; + case MORE_SHARE_EDIT: + bt_1 = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, LABEL_SHARE, NULL, mf_callback_share_cb, ap); + default: + break; + } + if (more_bt) { + elm_object_item_part_content_set(navi_it, NAVI_MORE_BUTTON_PART, more_bt); + } + if (bt_1) { + elm_object_item_part_content_set(navi_it, NAVI_BOTTOM_BUTTON_1_PART, bt_1); + } + if (bt_2) { + elm_object_item_part_content_set(navi_it, NAVI_BOTTOM_BUTTON_2_PART, bt_2); + } + +} +void mf_navi_bar_reset_ctrl_button(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *navi_it = ap->mf_MainWindow.pNaviItem; + mf_retm_if(navi_it == NULL, "navi_it is NULL"); + + Evas_Object *more_bt = NULL; + Evas_Object *bt_1 = NULL; + Evas_Object *bt_2 = NULL; + more_bt = elm_object_item_part_content_unset(navi_it, NAVI_MORE_BUTTON_PART); + SAFE_FREE_OBJ(more_bt); + bt_1 = elm_object_item_part_content_unset(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + SAFE_FREE_OBJ(bt_1); + bt_2 = elm_object_item_part_content_unset(navi_it, NAVI_BOTTOM_BUTTON_2_PART); + SAFE_FREE_OBJ(bt_2); + mf_navi_bar_set_ctrl_button(ap); +} +void mf_navi_bar_create_default_view(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + + GString *title = NULL; + Evas_Object *newContent = NULL; + Evas_Object *box = NULL; + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + mf_retm_if(ap->mf_MainWindow.pNaviBar == NULL, "ap->mf_MainWindow.pNaviBar is NULL"); + + __mf_navi_bar_reset_navi_obj(ap); + + MF_TA_ACUM_ITEM_BEGIN(" create view box", 0); + ap->mf_MainWindow.pNaviBox = mf_widget_create_box(ap->mf_MainWindow.pNaviBar); + MF_TA_ACUM_ITEM_END(" create view box", 0); + + ap->mf_MainWindow.pNaviLayout = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, "selectinfo_layout"); + /*set content*/ + MF_TA_ACUM_ITEM_BEGIN(" create genlist", 0); + newContent = mf_navi_bar_content_create(ap); + MF_TA_ACUM_ITEM_END(" create genlist", 0); + /*set title segment or title*/ + evas_object_show(newContent); + MF_TA_ACUM_ITEM_BEGIN(" set title", 0); + if (ap->mf_Status.view_type == mf_view_root) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else { + title = mf_fm_svc_wrapper_get_file_name(ap->mf_Status.path); + } + MF_TA_ACUM_ITEM_END(" set title", 0); + + MF_TA_ACUM_ITEM_BEGIN(" set content of conform", 0); + + if (title != NULL) { + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + + /*navigation view integration*/ + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, newContent); + MF_TA_ACUM_ITEM_END(" set content of conform", 0); + + MF_TA_ACUM_ITEM_BEGIN(" set conform to box", 0); + elm_box_pack_end(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviLayout); + MF_TA_ACUM_ITEM_END(" set conform to box", 0); + + MF_TA_ACUM_ITEM_BEGIN(" create header box", 0); + if (ap->mf_Status.view_type == mf_view_normal + ) { + box = mf_navi_bar_create_header_box(ap); + if (box) { + ap->mf_MainWindow.pNaviInfoBox = box; + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, box); + } + } + MF_TA_ACUM_ITEM_END(" create header box", 0); + + MF_TA_ACUM_ITEM_BEGIN(" push view to navibar", 0); + + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + ap->mf_MainWindow.pNaviItem = elm_naviframe_item_push(ap->mf_MainWindow.pNaviBar, NULL, NULL, NULL, ap->mf_MainWindow.pNaviBox, MF_NAVI_STYLE_ENABLE); + + MF_TA_ACUM_ITEM_END(" push view to navibar", 0); + + MF_TA_ACUM_ITEM_BEGIN(" add backbutton", 0); + if (ap->mf_Status.more != MORE_INTERNAL_COPY && ap->mf_Status.more != MORE_INTERNAL_MOVE) { + mf_navi_add_back_button(ap); + } + MF_TA_ACUM_ITEM_END(" add backbutton", 0); + + /*add control bar for navigation bar*/ + MF_TA_ACUM_ITEM_BEGIN(" add control bar", 0); + //mf_navi_bar_set_ctrl_bar(ap); + + mf_navi_bar_set_ctrl_button(data); + MF_TA_ACUM_ITEM_END(" add control bar", 0); + + MF_TA_ACUM_ITEM_BEGIN(" set control bar", 0); + if (ap->mf_Status.flagNoContent == 1) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, true); + } else { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_NOCONTENT_VIEW, FALSE); + } +#ifdef MYFILE_USB_OTG + if(mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str) == MYFILE_OTG) { + ap->mf_Otg.rootpath_box = ap->mf_MainWindow.pNaviBox; + ap->mf_Otg.rootpath_layout = ap->mf_MainWindow.pNaviLayout; + ap->mf_Otg.rootpath_navi_item = ap->mf_MainWindow.pNaviItem; + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_ROOT, TRUE); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_OTG_ROOT, TRUE); + } +#endif + MF_TA_ACUM_ITEM_END(" set control bar", 0); + mf_navi_bar_title_set(ap); + /*temp data free*/ + MF_TRACE_END; +} + +/****************************** +** Prototype : mf_navi_bar_create_edit_view +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_navi_bar_remove_path_info(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (!mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + elm_box_unpack(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviPathInfo); + evas_object_hide(ap->mf_MainWindow.pNaviPathInfo); + //evas_object_del(pNavi_s->pNaviPathInfo); + ap->mf_MainWindow.pEditView.pPathInfo = ap->mf_MainWindow.pNaviPathInfo; + } else { + ap->mf_MainWindow.pEditView.pPathInfo = NULL; + } + MF_TRACE_END; +} + +void mf_navi_bar_recover_path_info(void *data, myfileNaviBar *pNavi_s) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (ap->mf_MainWindow.pEditView.pPathInfo) { + ap->mf_MainWindow.pNaviPathInfo = ap->mf_MainWindow.pEditView.pPathInfo; + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviPathInfo); + evas_object_show(ap->mf_MainWindow.pEditView.pPathInfo); + } + + MF_TRACE_END; + return; +} + +void mf_navi_bar_remove_info_box(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (!mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + elm_box_unpack(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviInfoBox); + evas_object_hide(ap->mf_MainWindow.pNaviInfoBox); + ap->mf_MainWindow.pEditView.pInfoBox = ap->mf_MainWindow.pNaviInfoBox; + } else { + ap->mf_MainWindow.pEditView.pInfoBox = NULL; + } + MF_TRACE_END; +} + +void mf_navi_bar_recover_info_box(void *data, myfileNaviBar *pNavi_s) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + if (ap->mf_MainWindow.pEditView.pInfoBox) { + ap->mf_MainWindow.pNaviInfoBox = ap->mf_MainWindow.pEditView.pInfoBox; + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviInfoBox); + evas_object_show(ap->mf_MainWindow.pEditView.pInfoBox); + } + + MF_TRACE_END; + return; +} + +void mf_navi_bar_edit_list_update(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + if (ap->mf_MainWindow.pNaviGenlist) { + mf_genlist_sweep_item_recover(ap->mf_MainWindow.pNaviGenlist); + mf_genlist_update_edit_view_item_style(ap); + if (ap->mf_Status.more == MORE_SHARE_EDIT) { + mf_genlist_set_folder_edit_style(); + } + ap->mf_MainWindow.pEditView.pGenlist = ap->mf_MainWindow.pNaviGenlist; + elm_genlist_decorate_mode_set(ap->mf_MainWindow.pNaviGenlist, EINA_TRUE); + } + } else { + Eina_List *file_list = NULL; + Eina_List *dir_list = NULL; + { + + if (ap->mf_Status.view_type == mf_view_root_category) { + file_list = ap->mf_FileOperation.category_list; + } else { + file_list = ap->mf_FileOperation.file_list; + dir_list = ap->mf_FileOperation.folder_list; + } + + if (ap->mf_MainWindow.pNaviGengrid) { + elm_gengrid_clear(ap->mf_MainWindow.pNaviGengrid); + mf_gengrid_create_list_default_style(ap->mf_MainWindow.pNaviGengrid, ap, dir_list, file_list); + ap->mf_MainWindow.pEditView.pGengrid = ap->mf_MainWindow.pNaviGengrid; + } + } + } + +} + +void mf_navi_bar_create_edit_view(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + //Evas_Object *pSelectAllLayout = NULL; + /*get navigation bar to create view*/ + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + ap->mf_MainWindow.pEditView.pBox = ap->mf_MainWindow.pNaviBox; + + mf_navi_bar_remove_info_box(ap); + /*create conformant*/ + mf_navi_remove_home_upper_button(ap); + + Evas_Object *select_all_btn = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_style_set(select_all_btn, "naviframe/title_icon"); + Evas_Object *select_all_ic = elm_image_add(ap->mf_MainWindow.pNaviBar); + elm_image_file_set(select_all_ic, MF_TITLE_ICON_SELECT_ALL, NULL); + elm_image_resizable_set(select_all_ic, EINA_TRUE, EINA_TRUE); + elm_object_content_set(select_all_btn, select_all_ic); + evas_object_smart_callback_add(select_all_btn, "clicked", (Evas_Smart_Cb)__mf_genlist_select_all_layout_mouse_down_cb, ap); + evas_object_smart_callback_add(select_all_btn, "pressed", (Evas_Smart_Cb)mf_callback_select_all_button_pressed_cb, select_all_ic); + evas_object_smart_callback_add(select_all_btn, "unpressed", (Evas_Smart_Cb)mf_callback_select_all_button_unpressed_cb, select_all_ic); + evas_object_show(select_all_btn); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, TITLE_RIGHT_BTN, select_all_btn); + + mf_navi_bar_title_set(ap); + mf_navi_bar_reset_ctrl_button(ap); + + + if (ap->mf_Status.flagViewType != MF_VIEW_STYLE_THUMBNAIL) { + Elm_Object_Item *it; + it = elm_genlist_first_item_get(ap->mf_MainWindow.pNaviGenlist); + while (it) { + elm_genlist_item_fields_update(it, "elm.icon.2", ELM_GENLIST_ITEM_FIELD_CONTENT); + it = elm_genlist_item_next_get(it); + } + } + + + //mf_ctrl_bar_reset(ap); + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_EDIT_ALL, TRUE); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_EDIT_ALL, true); + /** Todo: should we add segment status set here?*/ + /*temp data free*/ + MF_TRACE_END; +} + +/****************************** +** Prototype : mf_navi_bar_create_path_select_view +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_navi_bar_create_path_select_view(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + GString *title = NULL; + Evas_Object *newContent = NULL; + Evas_Object *box = NULL; + /*get navigation bar to create view*/ + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + /*set pre_status*/ + pNavi_s->pre_more = ap->mf_Status.more; + /*create conformant*/ + + __mf_navi_bar_reset_navi_obj(ap); + + ap->mf_MainWindow.pNaviBox = mf_widget_create_box(ap->mf_MainWindow.pNaviBar); + ap->mf_MainWindow.pNaviLayout = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, "selectinfo_layout"); + /*set content*/ + newContent = mf_navi_bar_content_create(ap); + + /*set title segment or title*/ + if (ap->mf_Status.view_type == mf_view_root) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else { + title = mf_fm_svc_wrapper_get_file_name(ap->mf_Status.path); + } + + if (title != NULL) { + + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, newContent); + elm_box_pack_end(ap->mf_MainWindow.pNaviBox, ap->mf_MainWindow.pNaviLayout); + if (ap->mf_Status.view_type == mf_view_normal) { + box = mf_navi_bar_create_header_box(ap); + if (box) { + ap->mf_MainWindow.pNaviInfoBox = box; + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, box); + } + } + /*Navigation bar Path Select view integration*/ + + MF_TA_ACUM_ITEM_BEGIN(" push view to navibar", 0); + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + ap->mf_MainWindow.pNaviItem = elm_naviframe_item_push(ap->mf_MainWindow.pNaviBar, NULL, NULL, NULL, ap->mf_MainWindow.pNaviBox, MF_NAVI_STYLE_ENABLE); + MF_TA_ACUM_ITEM_END(" push view to navibar", 0); + + mf_navi_add_back_button(ap); + + /*add control bar for navigation bar*/ + //mf_navi_bar_set_ctrl_bar(ap); + mf_navi_bar_set_ctrl_button(data); +#ifdef MYFILE_USB_OTG + /*control bar disable set if in otg root path*/ + if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str) == MYFILE_OTG) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_OPT_ROOT, TRUE); + } +#endif + if (ap->mf_Status.view_type == mf_view_root || ap->mf_Status.view_type == mf_view_root_category) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_ROOT, TRUE); + } + mf_navi_bar_title_set(ap); + MF_TRACE_END; + + /** Todo: should we add segment status set here?*/ + /*temp data free*/ +} + +void mf_navi_bar_create_path_select_view_otg_root(void *data) +{ + + struct appdata *ap = (struct appdata *)data; + GString *title = NULL; + Evas_Object *newContent = NULL; + + /*get navigation bar to create view*/ + myfileNaviBar *pNavi_s = mf_navi_bar_get_struct_by_label(ap, GET_STR(MF_LABEL_OTG)); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + + /*set pre_status*/ + pNavi_s->pre_more = ap->mf_Status.more; + /*create conformant*/ + __mf_navi_bar_reset_navi_obj(ap); + + ap->mf_MainWindow.pNaviLayout = mf_widget_create_layout(ap->mf_MainWindow.pNaviBar, EDJ_NAME, "selectinfo_layout"); + + ap->mf_MainWindow.pNaviBox = ap->mf_MainWindow.pNaviLayout; + /*set content*/ + newContent = mf_navi_bar_content_create(ap); + + /*set title segment or title*/ + if (ap->mf_Status.view_type == mf_view_root) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else if (mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str)) { + title = g_string_new(GET_SYS_STR(LABEL_MYFILE)); + } else { + title = mf_fm_svc_wrapper_get_file_name(ap->mf_Status.path); + } + + if (title != NULL) { + + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + /*Navigation bar Path Select view integration*/ + mf_navi_bar_set_style(ap, NAVI_BAR_PATH_WITH_ONE_ACTION, newContent); + /*add control bar for navigation bar*/ + //mf_navi_bar_set_ctrl_bar(ap); + mf_navi_add_back_button(ap); + mf_navi_bar_set_ctrl_button(data); + mf_navi_bar_title_set(ap); +#ifdef MYFILE_USB_OTG + /*control bar disable set if in otg root path*/ + if(mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str) == MYFILE_OTG) { + mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_ROOT, TRUE); + //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_OTG_ROOT, TRUE); + } + +#endif + /** Todo: should we add segment status set here?*/ + /*temp data free*/ +} + + +/****************************** +** Prototype : mf_navi_bar_create_search_view +** Description : +** Input : void *data +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +#ifdef MYFILE_SPLIT_VIEW +void mf_navi_bar_set_panes_navi_to_main(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + + mf_widget_unset_main_layout_content(ap->mf_MainWindow.sSplitData.pMainLayout); + /***1. unset naviframe from panes/right layout **/ + mf_split_view_unset_right_content(ap); + /***2. unset panes from main layout **/ + mf_widget_unset_main_layout_content(ap->mf_MainWindow.pMainLayout); + + + /***3. set naviframe to main layout **/ + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); + } + MF_TRACE_END; +} + +void mf_navi_bar_reset_panes_main(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + + mf_widget_unset_main_layout_content(ap->mf_MainWindow.pMainLayout); + elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); + + mf_widget_panes_right_set(ap->mf_MainWindow.sSplitData.pPanes, ap->mf_MainWindow.sSplitData.pMainLayout); + /**** 3. set panes to main layout **/ + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.sSplitData.pPanes); + mf_split_view_show(ap); + MF_TRACE_END; +} +#endif +void mf_navi_bar_create_search_view(void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + + GString *title = NULL; + Evas_Object *path_label = NULL; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_set_panes_navi_to_main(ap); + } +#endif + + __mf_navi_bar_reset_navi_obj(ap); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navigation bar in use failed"); + Evas_Object *pSearchViewLayout = NULL; + //ap->mf_MainWindow.pNaviLayout = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, "selectinfo_layout"); + + ap->mf_MainWindow.pNaviLayout = mf_widget_create_layout(ap->mf_MainWindow.pNaviBar, EDJ_NAME, "search_view_layout"); + ap->mf_MainWindow.pNaviSearchBar = mf_navi_bar_create_search_bar(ap->mf_MainWindow.pNaviLayout, ap); + pSearchViewLayout = ap->mf_MainWindow.pNaviLayout; + + path_label = elm_label_add(pSearchViewLayout); + elm_object_focus_set(path_label, EINA_FALSE); + evas_object_size_hint_weight_set(path_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(path_label, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(path_label); + /*2.2 contribute label content*/ + char *path_in_label = mf_fm_svc_wrapper_translate_path(ap->mf_Status.path->str, MF_TRANS_OPTION_LABEL); + char *label_content = g_strconcat(GET_SYS_STR(MF_LABEL_SEARCH), ":", "
    ", path_in_label, NULL); + /*2.3 set style for path_label*/ + elm_label_line_wrap_set(path_label, ELM_WRAP_WORD); + elm_object_text_set(path_label, label_content); + + elm_object_part_content_set(pSearchViewLayout, "search_bar", ap->mf_MainWindow.pNaviSearchBar); + elm_object_part_content_set(pSearchViewLayout, "content", path_label); + + title = g_string_new(GET_SYS_STR(MF_LABEL_SEARCH)); + if (title != NULL) { + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + ap->mf_MainWindow.pNaviItem = elm_naviframe_item_push(ap->mf_MainWindow.pNaviBar, NULL, NULL, NULL, pSearchViewLayout, MF_NAVI_STYLE_ENABLE); + + + /*hide Tab Bar in search view*/ + + /*add control bar for navigation bar*/ + /*temp data free*/ + if (path_in_label != NULL) { + free(path_in_label); + path_in_label = NULL; + } + if (label_content != NULL) { + free(label_content); + label_content = NULL; + } + mf_navi_bar_title_set(ap); + evas_object_show(ap->mf_MainWindow.pSearchEntry); + + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_TRUE); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + + MF_TRACE_END; +} + +static void __new_folder_entryfield_create(Evas_Object *parent, void *data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + mf_retm_if(parent == NULL, "parent is NULL"); + int error_code = 0; + char *fileName = NULL; + GString *dest_fullpath; + static Elm_Entry_Filter_Limit_Size limit_filter; + Evas_Object *entry = NULL; + Evas_Object *edit_field = NULL; + char *fullpath = (char *)malloc(sizeof(char) * MYFILE_FILE_PATH_LEN_MAX); + if (fullpath == NULL) { + MF_TRACE_END; + return; + } + mf_widget_create_entryfield(ap, parent, mf_callback_new_folder_changed_cb, NULL); + entry = ap->mf_MainWindow.pEntry; + + edit_field = ap->mf_MainWindow.pEditField; + + limit_filter.max_char_count = MYFILE_FILE_NAME_LEN_MAX; + limit_filter.max_byte_count = 0; + + memset(fullpath, 0, MYFILE_FILE_PATH_LEN_MAX); + fileName = elm_entry_markup_to_utf8(GET_SYS_STR(MF_LABEL_FOLDER)); + snprintf(fullpath, (MYFILE_FILE_PATH_LEN_MAX), "%s/%s", (char *)ap->mf_Status.path->str, fileName); + + dest_fullpath = g_string_new(fullpath); + + elm_entry_markup_filter_append(ap->mf_MainWindow.pEntry, elm_entry_filter_limit_size, &limit_filter); + evas_object_smart_callback_add(ap->mf_MainWindow.pEntry, "maxlength,reached", mf_callback_max_len_reached_cb, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pEntry, "preedit,changed", + mf_callback_imf_preedit_change_cb, ap); + + if (mf_fm_svc_wrapper_detect_duplication(dest_fullpath)) { + mf_debug("dectetion result is TRUE\ndest_fullpath is %s\n", dest_fullpath->str); + error_code = mf_fm_svc_wrapper_file_auto_rename(ap, dest_fullpath, FILE_NAME_WITH_BRACKETS, &dest_fullpath); + mf_debug("rename result is %s\n", dest_fullpath->str); + memset(fullpath, 0, strlen(fullpath)); + int len = strlen(ap->mf_Status.path->str) + 1; + strncpy(fullpath, dest_fullpath->str + len, MYFILE_FILE_PATH_LEN_MAX); + /*memset(fileName,0,strlen(fileName));*/ + + SAFE_FREE_CHAR(fileName); + fileName = elm_entry_markup_to_utf8(fullpath); + } + + /*elm_entry_entry_set(entry, ecore_file_file_get(params->m_ItemName->str));*/ + mf_widget_imf_hide_callback_register(ap->mf_MainWindow.pConformant, entry); + + elm_entry_entry_set(entry, fileName); + elm_entry_cursor_end_set(entry); + + SAFE_FREE_CHAR(fullpath); + SAFE_FREE_GSTRING(dest_fullpath); + SAFE_FREE_CHAR(fileName); + MF_TRACE_END; + +} +void mf_navi_bar_create_new_folder_view(void *data) +{ + + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + + Evas_Object *newContent = NULL; + + Evas_Object *pNaviBar = NULL; + GString *title = NULL; + + mf_widget_set_navi_blocking(data, EINA_TRUE); +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_set_panes_navi_to_main(ap); + } +#endif + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "pNavi_s is NULL"); + + __mf_navi_bar_reset_navi_obj(ap); + + pNaviBar = ap->mf_MainWindow.pNaviBar; + ap->mf_MainWindow.pNaviBox = NULL; + ap->mf_MainWindow.pNaviLayout= NULL; + + ap->mf_MainWindow.pNaviBox = mf_widget_create_box(ap->mf_MainWindow.pNaviBar); + newContent = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, GRP_NEW_FOLDER); + __new_folder_entryfield_create(newContent, ap); + evas_object_size_hint_weight_set(newContent, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(newContent, EVAS_HINT_FILL, 0.0); + Evas_Object *pad = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, "PAD"); + elm_object_part_content_set(newContent, "content", ap->mf_MainWindow.pEditField); + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, newContent); + elm_box_pack_end(ap->mf_MainWindow.pNaviBox, pad); + //newContent = mf_genlist_create_list_new_folder_style(ap); + /*set title segment or title*/ + /*navigation view integration*/ + + title = g_string_new(GET_SYS_STR(MF_LABEL_CREATE_FOLDER)); + + if (title != NULL) { + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + + Elm_Object_Item *navi_it = NULL; + //mf_navi_bar_set_style(ap, NAVI_BAR_DEFAULT, newContent); + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + navi_it = elm_naviframe_item_push(pNaviBar, NULL, NULL, NULL, ap->mf_MainWindow.pNaviBox, NULL); + + ap->mf_MainWindow.pNaviItem = navi_it; + + mf_navi_bar_title_set(ap); + //mf_navi_add_back_button(ap); + + Evas_Object *l_bt = NULL; + Evas_Object *r_bt = NULL; + + l_bt = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_focus_set(l_bt, EINA_FALSE); + elm_object_style_set(l_bt, "naviframe/toolbar/default"); + elm_object_text_set(l_bt, GET_SYS_STR(LABEL_SAVE)); + mf_language_mgr_register_object(l_bt, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_SAVE); + evas_object_smart_callback_add(l_bt, "clicked", mf_callback_save_cb, ap); + evas_object_show(l_bt); + elm_object_item_part_content_set(navi_it, NAVI_BOTTOM_BUTTON_1_PART, l_bt); + //elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, TITLE_LEFT_BTN, l_bt); + + + r_bt = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_focus_set(r_bt, EINA_FALSE); + elm_object_style_set(r_bt, "naviframe/end_btn/default"); + //elm_object_style_set(r_bt, TITLE_BTN_STYLE); + //elm_object_text_set(r_bt, GET_SYS_STR(LABEL_CANCEL)); + //mf_language_mgr_register_object(r_bt, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_CANCEL); + evas_object_smart_callback_add(r_bt, "clicked", mf_callback_cancel_cb, ap); + evas_object_show(r_bt); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, "prev_btn", r_bt); + + + mf_callback_imf_state_callback_register(ap); + + elm_object_focus_set(ap->mf_MainWindow.pEntry, EINA_TRUE); + +} + +static void __rename_entryfield_create(Evas_Object *parent, void *data) +{ + MF_TRACE_BEGIN; + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + mf_retvm_if(params == NULL, NULL, "param is NULL"); + mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL"); + + struct appdata *ap = (struct appdata *)params->ap; + mf_retvm_if(ap == NULL, NULL, "input parameter data error"); + + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Evas_Object *edit_field = NULL; + Evas_Object *entry = NULL; + GString *filename = NULL; + + mf_widget_create_entryfield(ap, parent, mf_callback_imf_changed_cb, NULL); + + entry = ap->mf_MainWindow.pEntry; + + edit_field = ap->mf_MainWindow.pEditField; + + evas_object_size_hint_weight_set(edit_field, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(edit_field, EVAS_HINT_FILL, EVAS_HINT_FILL); + + + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_signal_emit(edit_field, "elm,state,eraser,show", "elm"); + //elm_editfield_eraser_set(edit_field, EINA_TRUE); + + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + + if (params->ap->mf_FileOperation.to_rename != NULL) { + g_string_free(params->ap->mf_FileOperation.to_rename, TRUE); + params->ap->mf_FileOperation.to_rename = NULL; + } + params->ap->mf_FileOperation.to_rename = g_string_new((char *)params->m_ItemName->str); + + + /* the below is sample code for control entry. It is not mandatory.*/ + + /* set guide text */ + filename = mf_fm_svc_wrapper_get_file_name(ap->mf_FileOperation.to_rename); + char *guide_text = NULL; + SAFE_FREE_CHAR(ap->mf_FileOperation.file_name_suffix); + if (!mf_file_attr_is_dir(ap->mf_FileOperation.to_rename->str)) { + mf_debug(); + char *ext = NULL; + char *name_without_ext = NULL; + name_without_ext = g_strdup(ap->mf_FileOperation.to_rename->str); + mf_file_attr_get_file_ext(ap->mf_FileOperation.to_rename->str, &ext); + mf_debug("ext is %s", ext); + if (ext && strlen(ext) != 0) { + mf_debug(); + name_without_ext[strlen(name_without_ext) - strlen(ext) - 1] = '\0'; + ap->mf_FileOperation.file_name_suffix = strdup(ext); + mf_debug("name_without_ext is [%s]\n", name_without_ext); + if (strlen(name_without_ext)) { + guide_text = elm_entry_utf8_to_markup(ecore_file_file_get(name_without_ext)); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + SAFE_FREE_CHAR(ext); + SAFE_FREE_CHAR(name_without_ext); + } else { + guide_text = elm_entry_utf8_to_markup(filename->str); + } + + if (ap->mf_FileOperation.file_name_suffix) { + limit_filter_data.max_char_count = (MYFILE_FILE_NAME_LEN_MAX - mf_util_character_count_get(ap->mf_FileOperation.file_name_suffix) - 1); + } else { + limit_filter_data.max_char_count = MYFILE_FILE_NAME_LEN_MAX; + } + + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(ap->mf_MainWindow.pEntry, elm_entry_filter_limit_size, &limit_filter_data); + elm_entry_input_panel_return_key_type_set(ap->mf_MainWindow.pEntry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + + elm_entry_entry_set(ap->mf_MainWindow.pEntry, guide_text); + /*elm_entry_entry_set(entry, ecore_file_file_get(params->m_ItemName->str));*/ + elm_entry_cursor_end_set(entry); + + SAFE_FREE_CHAR(guide_text); + SAFE_FREE_GSTRING(filename); + + evas_object_smart_callback_add(entry, "activated", mf_genlist_rename_done, params->ap); + evas_object_smart_callback_add(entry, "maxlength,reached", mf_callback_max_len_reached_cb, params->ap); + evas_object_smart_callback_add(entry, "preedit,changed", + mf_callback_imf_preedit_change_cb, ap); + mf_widget_imf_hide_callback_register(ap->mf_MainWindow.pConformant, entry); + + evas_object_show(entry); + elm_object_focus_set(entry, EINA_TRUE); + + MF_TRACE_END; + +} + +void mf_navi_bar_create_rename_view(void *data) +{ + + MF_TRACE_BEGIN; + mfItemData_s *params = (mfItemData_s *) data; + + struct appdata *ap = (struct appdata *)params->ap; + mf_retm_if(ap == NULL, "ap is NULL"); + + Evas_Object *newContent = NULL; + + Evas_Object *pNaviBar = NULL; + GString *title = NULL; +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_navi_bar_set_panes_navi_to_main(ap); + } +#endif + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "pNavi_s is NULL"); + + pNaviBar = ap->mf_MainWindow.pNaviBar; + SAFE_FREE_GSTRING(ap->mf_FileOperation.to_rename); + + ap->mf_FileOperation.to_rename = g_string_new((char *)params->m_ItemName->str); + + ap->mf_MainWindow.pNaviBox = NULL; + ap->mf_MainWindow.pNaviLayout= NULL; + + ap->mf_MainWindow.pNaviBox = mf_widget_create_box(ap->mf_MainWindow.pNaviBar); + newContent = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, GRP_NEW_FOLDER); + __rename_entryfield_create(newContent, params); + evas_object_size_hint_weight_set(newContent, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(newContent, EVAS_HINT_FILL, 0.0); + Evas_Object *pad = mf_widget_create_layout(ap->mf_MainWindow.pNaviBox, EDJ_NAME, "PAD"); + elm_object_part_content_set(newContent, "content", ap->mf_MainWindow.pEditField); + elm_box_pack_start(ap->mf_MainWindow.pNaviBox, newContent); + elm_box_pack_end(ap->mf_MainWindow.pNaviBox, pad); + + title = g_string_new(GET_SYS_STR(LABEL_RENAME)); + + if (title != NULL) { + pNavi_s->pNaviTitle = g_strdup(title->str); + g_string_free(title, TRUE); + title = NULL; + } + /*navigation view integration*/ + ap->mf_Status.pPreNaviItem = ap->mf_MainWindow.pNaviItem; + mf_language_mgr_unregister_object_item_by_type(ITEM_TYPE_CTRL); + ap->mf_MainWindow.pNaviItem = elm_naviframe_item_push(pNaviBar, NULL, NULL, NULL, ap->mf_MainWindow.pNaviBox, NULL); + + mf_navi_bar_title_set(ap); + + Evas_Object *l_bt = NULL; + Evas_Object *r_bt = NULL; + + l_bt = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_focus_set(l_bt, EINA_FALSE); + elm_object_style_set(l_bt, "naviframe/toolbar/default"); + elm_object_text_set(l_bt, GET_SYS_STR(LABEL_SAVE)); + mf_language_mgr_register_object(l_bt, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_SAVE); + evas_object_smart_callback_add(l_bt, "clicked", mf_callback_save_cb, ap); + evas_object_show(l_bt); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, NAVI_BOTTOM_BUTTON_1_PART, l_bt); + + r_bt = elm_button_add(ap->mf_MainWindow.pNaviBar); + elm_object_focus_set(r_bt, EINA_FALSE); + elm_object_style_set(r_bt, "naviframe/end_btn/default"); + evas_object_smart_callback_add(r_bt, "clicked", mf_callback_cancel_cb, ap); + evas_object_show(r_bt); + + mf_callback_imf_state_callback_register(ap); + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, "prev_btn", r_bt); + MF_TRACE_END; +} + + +myfileNaviBar *mf_navi_bar_get_in_use(void *data) +{ + + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + Eina_List *plistNavi_s = ap->mf_MainWindow.plistNaviBar; + mf_retvm_if(plistNavi_s == NULL, NULL, "plistNavi_s is NULL"); + + myfileNaviBar *ret = NULL; + Eina_List *l = NULL; + void *item; + + EINA_LIST_FOREACH(plistNavi_s, l, item) { + ret = (myfileNaviBar *) item; + + mf_retvm_if(ret == NULL, NULL, "item is NULL"); + + if (ret->naviFlagInUse == TRUE) { + break; + } else { + ret = NULL; + } + } + + return ret; +} + +myfileNaviBar *mf_navi_bar_get_edit_start(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + Eina_List *plistNavi_s = ap->mf_MainWindow.plistNaviBar; + assert(plistNavi_s); + + myfileNaviBar *ret = NULL; + Eina_List *l = NULL; + void *item; + + EINA_LIST_FOREACH(plistNavi_s, l, item) { + ret = (myfileNaviBar *) item; + if (ret->naviFlagEditStart == TRUE) { + break; + } else { + ret = NULL; + } + } + return ret; +} + +void mf_navi_bar_object_reset(myfileNaviBar *pNavi_s) +{ + mf_retm_if(pNavi_s == NULL, "Navi structure is NULL"); + pNavi_s->pNaviTitle = NULL; + + if (pNavi_s->pCurrentPath != NULL) + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + + if (pNavi_s->pNaviLabel != NULL) + free(pNavi_s->pNaviLabel); + pNavi_s->pNaviLabel = NULL; +} + +/****************************** +** Prototype : mfNaviBarListItemRemove +** Description : remove the navi bar item from the list by label +** Input : void *data +** const char* pNaviLabel +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +bool mf_navi_bar_remove_list_item_by_label(void *data, const char *pNaviLabel) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, false, "ap is NULL"); + mf_retvm_if(pNaviLabel == NULL, false, "Navi Bar Label is NULL"); + + bool bEditStartFlag = FALSE; + bool bInUseFlag = FALSE; + mf_debug(); + myfileNaviBar *pNavi_s = mf_navi_bar_get_struct_by_label(ap, pNaviLabel); + + if (pNavi_s == NULL) { + mf_debug(); + return bEditStartFlag; + } + Eina_List *plistNavi = eina_list_data_find_list(ap->mf_MainWindow.plistNaviBar, pNavi_s); + ap->mf_MainWindow.plistNaviBar = eina_list_remove_list(ap->mf_MainWindow.plistNaviBar, plistNavi); + + mf_debug(); + if (pNavi_s->naviFlagEditStart == TRUE) { + bEditStartFlag = TRUE; + } + if (pNavi_s->naviFlagInUse == TRUE) { + bInUseFlag = TRUE; + } + mf_debug(); + mf_navi_bar_object_reset(pNavi_s); + + if (bInUseFlag == TRUE) { + pNavi_s = (myfileNaviBar *) eina_list_nth(ap->mf_MainWindow.plistNaviBar, 0); + pNavi_s->naviFlagInUse = TRUE; + } + mf_debug(); + return bEditStartFlag; +} + +myfileNaviBar *mf_navi_bar_get_struct_by_label(void *data, const char *pNaviLabel) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + mf_retvm_if(pNaviLabel == NULL, NULL, "Navi Bar Label is NULL"); + + Eina_List *l = NULL; + void *item = NULL; + + myfileNaviBar *ret = NULL; + EINA_LIST_FOREACH(ap->mf_MainWindow.plistNaviBar, l, item) { + if (g_strcmp0(((myfileNaviBar *) item)->pNaviLabel, pNaviLabel) == 0) { + ret = (myfileNaviBar *) item; + break; + } + } + return ret; +} + +myfileNaviBar *mf_navi_bar_recover_list(void *data) +{ + mf_debug(); + struct appdata *ap = (struct appdata *)data; + assert(ap); + + /*0 set state to be Default*/ + ap->mf_Status.more = MORE_DEFAULT; + /*1 recover all the navigation bar*/ + Eina_List *l = NULL; + void *item = NULL; + myfileNaviBar *pNavi_s = NULL; + myfileNaviBar *pNavi_toshow = NULL; + bool flag_pop_todo = FALSE; + EINA_LIST_FOREACH(ap->mf_MainWindow.plistNaviBar, l, item) { + flag_pop_todo = TRUE; + pNavi_s = (myfileNaviBar *) item; + /*2.0 recover the pre_status*/ + pNavi_s->pre_more = ap->mf_Status.more; + /*2.1 recover the path just before when edit click*/ + pNavi_s->pCurrentPath = g_strdup(pNavi_s->pre_operation.path->str); + /*2.2 free the backup data structure*/ + g_string_free(pNavi_s->pre_operation.path, TRUE); + pNavi_s->pre_operation.path = NULL; + memset(&(pNavi_s->pre_operation), 0, sizeof(oper_record)); + /*2.3 set navi related status*/ + if (pNavi_s->naviFlagInUse == TRUE) { + /*2.1-1 set pNavi_toshow for refreshing*/ + pNavi_toshow = pNavi_s; + } + } + return pNavi_toshow; +} + +void mf_navi_bar_refresh_recovered_view(void *data, myfileNaviBar * pNaviStruct) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + mf_retm_if(pNaviStruct == NULL, "Navi Bar Struct is NULL"); + + if (ap->mf_Status.path != NULL) { + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + } + ap->mf_Status.path = g_string_new(pNaviStruct->pCurrentPath); + mf_debug("ap->mf_Status.path is [%s]", ap->mf_Status.path->str); + + /*insert new view*/ + mf_widget_refresh_view(ap); + + MF_TRACE_END; +} + +bool mf_navi_bar_is_navi_empty(void *data, char *label) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + assert(label); + + + Elm_Object_Item *top_it= elm_naviframe_top_item_get(ap->mf_MainWindow.pNaviBar); + Evas_Object *top_view = elm_object_item_content_get(top_it); + + if (top_view == NULL) + return TRUE; + else + return FALSE; +} + +void mf_navi_bar_transition_finished_cb(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(obj == NULL, "obj is NULL"); + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *it = ap->mf_Status.pPreNaviItem; + + SAFE_DEL_NAVI_ITEM(it); + ap->mf_Status.pPreNaviItem = NULL; + mf_widget_set_navi_blocking(ap, EINA_FALSE); + evas_object_smart_callback_del(obj, "transition,finished", mf_navi_bar_transition_finished_cb); + MF_TRACE_END; +} + +void mf_navi_bar_remove_previous_contents(void *data, Evas_Object *pNaviBar) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(pNaviBar == NULL, "pNaviBar is NULL"); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.pPreNaviItem != NULL) { + mf_widget_set_navi_blocking(data, EINA_TRUE); + evas_object_smart_callback_add(pNaviBar, "transition,finished", mf_navi_bar_transition_finished_cb, data); + } + MF_TRACE_END; +} + +void mf_navi_bottom_item_del(Elm_Object_Item **pPreNaviItem) +{ + MF_TRACE_BEGIN; + mf_retm_if(*pPreNaviItem == NULL, "pPreNaviItem is NULL"); + SAFE_DEL_NAVI_ITEM(*pPreNaviItem); + *pPreNaviItem = NULL; + MF_TRACE_END; +} + +myfileNaviBar *mf_navi_bar_get_navi_from_navilist(Eina_List *navilist, const char *label) +{ + + MF_TRACE_BEGIN; + mf_retvm_if(navilist == NULL, NULL, "navilist is NULL"); + mf_retvm_if(label == NULL, NULL, "label is NULL"); + + void *data = NULL; + myfileNaviBar *pNavi = NULL; + Eina_List *l = NULL; + EINA_LIST_FOREACH(navilist, l, data) { + if (data) { + pNavi = (myfileNaviBar *)data; + if (pNavi && pNavi->pNaviLabel && g_strcmp0(label, pNavi->pNaviLabel) == 0) + return pNavi; + else + continue; + } + } + return NULL; +} + + +void mf_navi_bar_del_item_directly(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + + if (ap->mf_Status.flagNaviPush) { + if(ap->mf_Status.pPreNaviItem) + { + SAFE_DEL_NAVI_ITEM(ap->mf_Status.pPreNaviItem); + mf_widget_set_navi_blocking(ap, EINA_FALSE); + evas_object_smart_callback_del(ap->mf_MainWindow.pNaviBar, "transition,finished", mf_navi_bar_transition_finished_cb); + } + } +} + +void mf_navi_bar_button_set_disable(Elm_Object_Item *navi_it, int disable_item, bool disable) +{ + MF_TRACE_BEGIN; + mf_retm_if(navi_it == NULL, "navi_it is NULL"); + Evas_Object *btn = NULL; + if (disable_item & CTRL_DISABLE_EDIT) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_SYS_STR(MF_LABEL_EDIT)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_DELETE) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_DELETE)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_SEND) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_SHARE)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_SEND) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_2_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_SHARE)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_COPY_HERE) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_STR(LABEL_COPY_HERE)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_MOVE_HERE) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_STR(LABEL_MOVE_HERE)) == 0) + elm_object_disabled_set(btn, disable); + + } + if (disable_item & CTRL_DISABLE_CREATE) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_2_PART); + const char *button_label = elm_object_text_get(btn); + if (g_strcmp0(button_label, GET_SYS_STR(MF_LABEL_CREATE_FOLDER)) == 0) + elm_object_disabled_set(btn, disable); + } + if (disable_item & CTRL_DISABLE_MORE) { + btn = elm_object_item_part_content_get(navi_it, NAVI_MORE_BUTTON_PART); + elm_object_disabled_set(btn, disable); + } + + if (disable_item & CTRL_DISABLE_SEARCH) { + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + elm_object_disabled_set(btn, disable); + } + + MF_TRACE_END; + +} + + +int mf_navi_bar_button_get_disable(Elm_Object_Item *navi_it) +{ + mf_retvm_if(navi_it == NULL, 0, "navi_it is NULL"); + int disable_item = 0; + const char *button_label = NULL; + + Evas_Object *btn = NULL; + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_1_PART); + button_label = elm_object_text_get(btn); + if(elm_object_disabled_get(btn)) { + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_DELETE)) == 0) { + disable_item |= CTRL_DISABLE_DELETE; + } + } + + btn = elm_object_item_part_content_get(navi_it, NAVI_BOTTOM_BUTTON_2_PART); + button_label = elm_object_text_get(btn); + if(elm_object_disabled_get(btn)) { + if (g_strcmp0(button_label, GET_SYS_STR(LABEL_SHARE)) == 0) { + disable_item |= CTRL_DISABLE_SEND; + } + } + + return disable_item; +} + diff --git a/src/widget/mf-popup.c b/src/widget/mf-popup.c new file mode 100644 index 0000000..0afed34 --- /dev/null +++ b/src/widget/mf-popup.c @@ -0,0 +1,806 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include + +#include "mf-util.h" +#include "mf-widget.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-callback.h" +#include "mf-language-mgr.h" + +#define ITEM_COUNT 6 +#define ITEM_MAX_COUNT 4 +#define SHARE_ITEM_COUNT 4 +#define MF_POPUP_STYLE_MIN_MENUSTYLE "menustyle" +#define MF_POPUP_MENUSTYLE_WIDTH (614*elm_config_scale_get()) +#define MF_POPUP_MENUSTYLE_HEIGHT(x) ((113*x-1)*elm_config_scale_get()) +#define MF_POPUP_MENUSTYLE_HEIGHT_MAX (408*elm_config_scale_get()) +Elm_Genlist_Item_Class listby_itc, share_itc, storage_itc; + +typedef struct { + int index; + bool unregister_lang_mgr; + Elm_Object_Item *item; + struct appdata *ap; +} ListByData_s; + +static int __mf_popup_get_list_by_selected_item() +{ + int iSortTypeValue = 0; + mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + + int ret = -1; + switch (iSortTypeValue) { + case MYFILE_SORT_BY_DATE_O2R: + ret = 3; + break; + case MYFILE_SORT_BY_DATE_R2O: + ret = 2; + break; + case MYFILE_SORT_BY_TYPE_A2Z: + ret = 5; + break; + case MYFILE_SORT_BY_NAME_A2Z: + ret = 0; + break; + case MYFILE_SORT_BY_NAME_Z2A: + ret = 1; + break; + case MYFILE_SORT_BY_SIZE_L2S: + ret = 4; + break; + case MYFILE_SORT_BY_SIZE_S2L: + case MYFILE_SORT_BY_TYPE_Z2A: + default: + ret = 0; + break; + } + return ret; +} + +static int __mf_popup_get_list_by_opt(int index) +{ + //int iSortTypeValue = 0; + //mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + + fsSortOption ret = MYFILE_SORT_BY_NONE; + switch (index) { + case 0: + ret = MYFILE_SORT_BY_NAME_A2Z; + break; + case 1: + ret = MYFILE_SORT_BY_NAME_Z2A; + break; + case 2: + ret = MYFILE_SORT_BY_DATE_R2O; + break; + case 3: + ret = MYFILE_SORT_BY_DATE_O2R; + break; + case 4: + ret = MYFILE_SORT_BY_SIZE_L2S; + break; + case 5: + ret = MYFILE_SORT_BY_TYPE_A2Z; + break; + default: + ret = MYFILE_SORT_BY_DATE_R2O; + break; + } + return ret; +} + +static int __mf_popup_get_view_as_type(int index) +{ + eMfViewStyle ret = MF_VIEW_STYLE_LIST; + switch (index) { + case 0: + ret = MF_VIEW_STYLE_LIST; + break; + case 1: + ret = MF_VIEW_SYTLE_LIST_DETAIL; + break; + case 2: + ret = MF_VIEW_STYLE_THUMBNAIL; + break; + default: + ret = MF_VIEW_STYLE_LIST; + break; + } + return ret; +} + +static void __mf_popup_listby_genlist_del(void *data, Evas_Object * obj) +{ + MF_TRACE_BEGIN; + ListByData_s *params = (ListByData_s *) data; + mf_retm_if(params == NULL, "params is NULL"); + + if(params->unregister_lang_mgr) + mf_language_mgr_unregister_genlist_item(params->item); + SAFE_FREE_CHAR(params); +} + +static char *__mf_popup_get_genlist_label(void *data, Evas_Object * obj, const char *part) +{ + ListByData_s *params = (ListByData_s *) data; + assert(params); + struct appdata *ap = params->ap; + assert(ap); + assert(part); + + char *ret = NULL; + if (!strcmp(part, "elm.text")) { + //listby_opt = __mf_popup_get_list_by_opt(params->index); + switch (params->index) { + case 0: + ret = g_strdup(GET_STR(MF_LABEL_NAME_HA_TO_Z)); + break; + case 1: + ret = g_strdup(GET_STR(MF_LABEL_NAME_HZ_TO_A)); + break; + case 2: + ret = g_strdup(GET_STR(MF_LABEL_DATE_HMOST_RECENT)); + break; + case 3: + ret = g_strdup(GET_STR(MF_LABEL_DATE_HOLDEST)); + break; + case 4: + ret = g_strdup(GET_SYS_STR(MF_LABEL_SIZE)); + break; + case 5: + ret = g_strdup(GET_SYS_STR(MF_LABEL_TYPE)); /**< Sort by file size descending */ + break; + #if 0 + case MYFILE_SORT_BY_DATE_R2O: /**< Sort by file date descending */ + ret = g_strdup(GET_SYS_STR(MF_LABEL_DATE)); + break; + case MYFILE_SORT_BY_TYPE_Z2A: /**< Sort by file type descending */ + ret = g_strdup(GET_SYS_STR(MF_LABEL_TYPE)); + break; + #endif + default: + break; + } + return ret; + } + return NULL; +} + +static char *__mf_popup_view_as_genlist_label_get(void *data, Evas_Object * obj, const char *part) +{ + ListByData_s *params = (ListByData_s *) data; + assert(params); + struct appdata *ap = params->ap; + assert(ap); + assert(part); + + eMfViewStyle view_as_type = MF_VIEW_STYLE_LIST; + + char *ret = NULL; + if (!strcmp(part, "elm.text")) { + view_as_type = __mf_popup_get_view_as_type(params->index); + switch (view_as_type) { + case MF_VIEW_STYLE_LIST: /**< Sort by file name ascending */ + ret = g_strdup(GET_SYS_STR(MF_LABEL_LIST)); + break; + case MF_VIEW_SYTLE_LIST_DETAIL: /**< Sort by file size ascending */ + ret = g_strdup(GET_STR(LABEL_LIST_DETAIL_VIEW)); + break; + case MF_VIEW_STYLE_THUMBNAIL: /**< Sort by file date ascending */ + ret = g_strdup(GET_STR(MF_LABEL_THUMBNAILS)); + break; + default: + break; + } + return ret; + } + return NULL; +} + +static Evas_Object* __mf_popup_get_genlist_icon(void *data, Evas_Object * obj, const char *part) +{ + ListByData_s *params = (ListByData_s *) data; + assert(params); + struct appdata *ap = params->ap; + assert(ap); + assert(part); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *radio = NULL; + radio = elm_radio_add(obj); + elm_object_focus_set(radio, EINA_FALSE); + elm_radio_state_value_set(radio, params->index); + elm_radio_group_add(radio, ap->mf_Status.pRadioGroup); + elm_radio_value_set(radio, ap->mf_Status.iRadioValue); + evas_object_show(radio); + return radio; + } + return NULL; +} + +static void __mf_popup_genlist_select(void *data, Evas_Object * obj, void *event_info) +{ + assert(data); + assert(event_info); + ListByData_s *params = NULL; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + + if (item != NULL) { + + elm_genlist_item_selected_set(item, FALSE); + params = (ListByData_s *) elm_object_item_data_get(item); + if (params != NULL && params->ap != NULL) { + fsSortOption iListBySortType = MYFILE_SORT_BY_NONE; + params->ap->mf_Status.iSelectedSortType = params->index; + elm_radio_value_set(params->ap->mf_Status.pRadioGroup, params->index); + iListBySortType = __mf_popup_get_list_by_opt(params->index); + mf_util_set_sort_type(iListBySortType); + mf_callback_list_by_response_cb(params->ap); + } + } +} + + +static void __mf_popup_view_as_genlist_select(void *data, Evas_Object * obj, void *event_info) +{ + assert(data); + assert(event_info); + ListByData_s *params = NULL; + int iViewAsType = 0; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + params = (ListByData_s *) elm_object_item_data_get(item); + if (params != NULL && params->ap != NULL) { + elm_radio_value_set(params->ap->mf_Status.pRadioGroup, params->index); + iViewAsType = __mf_popup_get_view_as_type(params->index); + params->ap->mf_Status.flagViewType = iViewAsType; + mf_util_set_view_style(iViewAsType); + mf_callback_popup_del_idler_cb(params->ap); + if (params->ap->mf_Status.flagNoContent != EINA_TRUE) { + mf_widget_refresh_view(params->ap); + } + } + } +} +static int __mf_popup_get_view_as_selected_item() +{ + int iViewAs = 0; + + mf_util_get_vconf_value(VCONF_TYPE_VIEW_STYLE, &iViewAs); + + int ret = -1; + switch (iViewAs) { + case MF_VIEW_STYLE_LIST: + ret = 0; + break; + case MF_VIEW_SYTLE_LIST_DETAIL: + ret = 1; + break; + case MF_VIEW_STYLE_THUMBNAIL: + ret = 2; + break; + default: + ret = 0; + break; + } + return ret; +} + +#ifdef MYFILE_SPLIT_VIEW +static void __mf_popup_storage_genlist_del(void *data, Evas_Object * obj) +{ + MF_TRACE_BEGIN; + StorageData_s *params = (StorageData_s *) data; + mf_retm_if(params == NULL, "params is NULL"); + + if(params->unregister_lang_mgr) + mf_language_mgr_unregister_genlist_item(params->item); + SAFE_FREE_CHAR(params->label); + SAFE_FREE_CHAR(params); +} + +static char *__mf_popup_get_storage_genlist_label(void *data, Evas_Object * obj, const char *part) +{ + MF_TRACE_BEGIN; + StorageData_s *params = (StorageData_s *) data; + mf_retvm_if(params == NULL, NULL, "params is NULL"); + struct appdata *ap = params->ap; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + assert(part); + + if (!strcmp(part, "elm.text")) { + MF_TRACE_END; + return strdup(params->label); + } + MF_TRACE_END; + return NULL; +} + +static Evas_Object* __mf_popup_get_storage_genlist_icon(void *data, Evas_Object * obj, const char *part) +{ + MF_TRACE_BEGIN; + StorageData_s *params = (StorageData_s *) data; + mf_retvm_if(params == NULL, NULL, "params is NULL"); + struct appdata *ap = params->ap; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + assert(part); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *radio = NULL; + radio = elm_radio_add(obj); + elm_object_focus_set(radio, EINA_FALSE); + elm_radio_state_value_set(radio, params->index); + elm_radio_group_add(radio, ap->mf_Status.pRadioGroup); + elm_radio_value_set(radio, ap->mf_Status.iRadioValue); + evas_object_show(radio); + MF_TRACE_END; + return radio; + } + MF_TRACE_END; + return NULL; +} + +static void __mf_popup_storage_genlist_select(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(event_info == NULL, "event_info is NULL"); + StorageData_s *params = NULL; + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + params = (StorageData_s *) elm_object_item_data_get(item); + if (params != NULL && params->ap != NULL) { + } + } +} +#endif +/****************************** +** Prototype : mf_popup_create_pb_popup +** Description : +** Input : void *data +** char *context +** int file_count +** void*func +** void* param +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Evas_Object *mf_popup_create_pb_popup(void *data, char *context, int file_count, void *func, void *param) +{ + + struct appdata *ap; + + ap = (struct appdata *)data; + assert(ap); + + char count[256] = { 0 }; + Evas_Object *popup, *progressbar; + Evas_Object *layout; + + snprintf(count, sizeof(count), "%s0/%d", count, file_count); + + popup = elm_popup_add(ap->mf_MainWindow.pMainLayout); + elm_object_focus_set(popup, EINA_FALSE); + + layout = elm_layout_add(popup); + elm_object_focus_set(layout, EINA_FALSE); + elm_layout_file_set(layout, EDJ_NAME, "popup_center_progressview"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ap->mf_MainWindow.pProgressLayout = layout; + + progressbar = elm_progressbar_add(popup); + elm_object_focus_set(progressbar, EINA_FALSE); + ap->mf_FileOperation.progress_bar = progressbar; + elm_object_style_set(progressbar, "list_progress"); + elm_progressbar_horizontal_set(progressbar, EINA_TRUE); + evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_value_set(progressbar, 0.0); + evas_object_show(progressbar); + + elm_object_part_content_set(layout, "elm.swallow.content", progressbar); + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.title", context); + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.text.left", "0%"); + edje_object_part_text_set(elm_layout_edje_get(layout), "elm.text.right", count); + + elm_object_content_set(popup, layout); + + Evas_Object *btn1 = mf_widget_button_create(popup, GET_SYS_STR(LABEL_CANCEL)); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + + evas_object_show(popup); + + return popup; +} + +/****************************** +** Prototype : mf_popup_create_popup +** Description : +** Input : void *data +** ePopMode popupMode +** char *title +** char *context +** char *first_btn_text +** char *second_btn_text +** char *third_btn_text +** Evas_Smart_Cb func +** void* param +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +#ifdef MYFILE_SPLIT_VIEW +static void mf_popup_storage_item_append(void *data, Evas_Object *popup, Evas_Object *genlist) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + mf_retm_if(popup == NULL, "popup is NULL"); + mf_retm_if(genlist == NULL, "genlist is NULL"); + + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *it = NULL; + + StorageData_s *item_data = malloc(sizeof(StorageData_s)); + if (item_data == NULL) { + mf_util_operation_alloc_failed(ap); + MF_TRACE_END; + return; + } + + item_data->label= strdup(GET_SYS_STR(MF_LABEL_PHONE)); + item_data->index = MYFILE_PHONE; + + item_data->unregister_lang_mgr = TRUE; + item_data->ap = ap; + it = elm_genlist_item_append(genlist, &storage_itc, (void *)item_data, NULL, + ELM_GENLIST_ITEM_NONE, __mf_popup_storage_genlist_select, popup); + item_data->item = it; + mf_language_mgr_register_genlist_item(it); + + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + StorageData_s *item_data = malloc(sizeof(StorageData_s)); + if (item_data == NULL) { + mf_util_operation_alloc_failed(ap); + MF_TRACE_END; + return; + } + item_data->label = strdup(GET_SYS_STR(MF_LABEL_MMC)); + mf_debug("item_data->label is [%s]", item_data->label); + item_data->index = MYFILE_MMC; + item_data->ap = ap; + it = elm_genlist_item_append(genlist, &storage_itc, (void *)item_data, NULL, + ELM_GENLIST_ITEM_NONE, __mf_popup_storage_genlist_select, popup); + item_data->item = it; + mf_language_mgr_register_genlist_item(it); + } + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + StorageData_s *item_data = malloc(sizeof(StorageData_s)); + if (item_data == NULL) { + mf_util_operation_alloc_failed(ap); + MF_TRACE_END; + return; + } + item_data->label = strdup(GET_STR(MF_LABEL_OTG)); + mf_debug("item_data->label is [%s]", item_data->label); + item_data->index = MYFILE_OTG; + item_data->ap = ap; + it = elm_genlist_item_append(genlist, &storage_itc, (void *)item_data, NULL, + ELM_GENLIST_ITEM_NONE, __mf_popup_storage_genlist_select, popup); + item_data->item = it; + mf_language_mgr_register_genlist_item(it); + } + MF_TRACE_END; +} +#endif + + +static Evas_Object *__mf_popup_box_set(Evas_Object *parent, Evas_Object *content, int item_cnt) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(content == NULL, NULL, "content is NULL"); + mf_retvm_if(item_cnt < 0, NULL, "content is NULL"); + + Evas_Object *box = elm_box_add(parent); + if (item_cnt > ITEM_MAX_COUNT) { + evas_object_size_hint_min_set(box, MF_POPUP_MENUSTYLE_WIDTH, + MF_POPUP_MENUSTYLE_HEIGHT(ITEM_MAX_COUNT)); + } else { + evas_object_size_hint_min_set(box, MF_POPUP_MENUSTYLE_WIDTH, + MF_POPUP_MENUSTYLE_HEIGHT(item_cnt)); + } + + evas_object_show(content); + elm_box_pack_end(box, content); + return box; +} + +Evas_Object *mf_ug_popup_create_search(void *data, Evas_Smart_Cb func, void *param) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + + Evas_Object *popup; + Evas_Object *layout; + Evas_Object *label = NULL; + + + popup = elm_popup_add(ap->mf_MainWindow.pMainLayout); + elm_object_focus_set(popup, EINA_FALSE); + + layout = elm_layout_add(popup); + elm_object_focus_set(layout, EINA_FALSE); + elm_layout_file_set(layout, EDJ_NAME, "popup_center_text"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ap->mf_MainWindow.pSearchLabel = layout; + + elm_object_part_text_set(layout, "elm.swallow.content", "Phone"); + elm_object_part_text_set(layout, "elm.title", mf_util_get_text(MF_LABEL_SEARCHING)); + + elm_object_content_set(popup, layout); + + Evas_Object *btn1 = mf_widget_button_create(popup, GET_SYS_STR(LABEL_CANCEL)); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + + evas_object_show(popup); + + return popup; +} + +Evas_Object *mf_popup_create_popup(void *data, ePopMode popupMode, char *title, const char *context, const char *first_btn_text, const char *second_btn_text, + const char *third_btn_text, Evas_Smart_Cb func, void *param) +{ + mf_debug(); + Evas_Object *popup; + struct appdata *ap; + Evas_Object *genlist; + Evas_Object *radio_group = NULL; + Evas_Object *box = NULL; + Evas_Object *btn1 = NULL; + Evas_Object *btn2 = NULL; + Evas_Object *btn3 = NULL; + int index = 0; + int listby_selected= 0; + int context_items = 0; +#ifdef MYFILE_SPLIT_VIEW + int storage = MYFILE_PHONE; +#endif + ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + popup = elm_popup_add(ap->mf_MainWindow.pWindow); + elm_object_focus_set(popup, EINA_FALSE); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + if (title) { + elm_object_part_text_set(popup, "title,text", title); + mf_language_mgr_register_object(popup, OBJ_TYPE_EDJE_OBJECT, "title,text", title); + } + if (context && popupMode != POPMODE_PROGRESSBAR) { + mf_debug(); + elm_object_text_set(popup, context); + } + + switch (popupMode) { + case POPMODE_TEXT: + case POPMODE_TITLE_TEXT: + elm_popup_timeout_set(popup, 3); + if (func != NULL) { + evas_object_smart_callback_add(popup, "response", func, param); + } + break; + case POPMODE_TEXT_NOT_DISABLED: + if (func != NULL) { + evas_object_smart_callback_add(popup, "response", func, NULL); + } + break; + + case POPMODE_TEXT_TWO_BTN: + case POPMODE_TITLE_TEXT_TWO_BTN: + btn1 = mf_widget_button_create(popup, first_btn_text); + elm_object_style_set(btn1, "popup_button/default"); + btn2 = mf_widget_button_create(popup, second_btn_text); + elm_object_style_set(btn2, "popup_button/default"); + if (g_strcmp0(GET_SYS_STR(LABEL_DELETE), first_btn_text) == 0) { + elm_object_style_set(btn1, "sweep/delete"); + elm_object_style_set(btn2, "sweep/multiline"); + } + evas_object_smart_callback_add(btn1, "clicked", func, param); + evas_object_smart_callback_add(btn2, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button2", btn2); + break; + + case POPMODE_TEXT_BTN: + case POPMODE_TITLE_TEXT_BTN: + btn1 = mf_widget_button_create(popup, GET_SYS_STR(MF_BUTTON_LABEL_OK)); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + break; + case POPMODE_TITLE_TEXT_THREE_BTN: + + elm_object_style_set(popup, "verticalbuttonstyle"); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + btn1 = mf_widget_button_create(popup, GET_SYS_STR(MF_LABEL_REPLACE)); + elm_object_style_set(btn1, "popup_button/default"); + btn2 = mf_widget_button_create(popup, GET_STR(MF_BUTTON_LABEL_RENAME_AUTOMATICALLY)); + elm_object_style_set(btn2, "popup_button/default"); + btn3 = mf_widget_button_create(popup, GET_SYS_STR(LABEL_CANCEL)); + elm_object_style_set(btn3, "popup_button/default"); + + evas_object_smart_callback_add(btn1, "clicked", mf_callback_operation_request_replace_cb, param); + evas_object_smart_callback_add(btn2, "clicked", mf_callback_operation_request_rename_cb, param); + evas_object_smart_callback_add(btn3, "clicked", mf_callback_operation_request_cancel_cb, param); + elm_object_part_content_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button2", btn2); + elm_object_part_content_set(popup, "button3", btn3); + break; + + case POPMODE_TITLE_LIST_BTN: + + elm_object_style_set(popup, MF_POPUP_STYLE_MIN_MENUSTYLE); + + btn1 = mf_widget_button_create(popup, GET_SYS_STR(LABEL_CANCEL)); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + + //btn2 = mf_widget_button_create(popup, GET_STR(MF_LABEL_DESCENDING)); + //elm_object_style_set(btn2, "popup_button/default"); + //evas_object_smart_callback_add(btn2, "clicked", func, param); + //elm_object_part_content_set(popup, "button2", btn2); + + if (ap->mf_Status.pRadioGroup) { + evas_object_del(ap->mf_Status.pRadioGroup); + ap->mf_Status.pRadioGroup = NULL; + } + + radio_group = elm_radio_add(ap->mf_MainWindow.pWindow); + elm_object_focus_set(radio_group, EINA_FALSE); + elm_radio_value_set(radio_group, 0); + evas_object_hide(radio_group); + ap->mf_Status.pRadioGroup = radio_group; + + listby_selected = __mf_popup_get_list_by_selected_item(); + ap->mf_Status.iRadioValue = listby_selected; + + listby_itc.item_style = "1text.1icon.2"; + listby_itc.func.text_get = __mf_popup_get_genlist_label; + listby_itc.func.content_get = __mf_popup_get_genlist_icon; + listby_itc.func.state_get = NULL; + listby_itc.func.del = __mf_popup_listby_genlist_del; + genlist = elm_genlist_add(popup); + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + elm_object_focus_set(genlist, EINA_FALSE); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + for (index = 0; index < ITEM_COUNT; index++) { + Elm_Object_Item *it = NULL; + ListByData_s *item_data = malloc(sizeof(ListByData_s)); + if (item_data == NULL) + continue; + + item_data->index = index; + item_data->unregister_lang_mgr = TRUE; + item_data->ap = ap; + it = elm_genlist_item_append(genlist, &listby_itc, (void *)item_data, NULL, + ELM_GENLIST_ITEM_NONE, __mf_popup_genlist_select, popup); + + item_data->item = it; + mf_language_mgr_register_genlist_item(it); + } + + box = __mf_popup_box_set(popup, genlist, ITEM_COUNT); + elm_object_content_set(popup, box); + evas_object_smart_callback_add(popup, "response", func, param); + break; + case POPMODE_VIEW_AS_LIST: + elm_object_style_set(popup, MF_POPUP_STYLE_MIN_MENUSTYLE); + + btn1 = mf_widget_button_create(popup, GET_SYS_STR(LABEL_CANCEL)); + elm_object_style_set(btn1, "popup_button/default"); + evas_object_smart_callback_add(btn1, "clicked", func, param); + elm_object_part_content_set(popup, "button1", btn1); + + if (ap->mf_Status.pRadioGroup) { + evas_object_del(ap->mf_Status.pRadioGroup); + ap->mf_Status.pRadioGroup = NULL; + } + + radio_group = elm_radio_add(ap->mf_MainWindow.pWindow); + elm_object_focus_set(radio_group, EINA_FALSE); + elm_radio_value_set(radio_group, 0); + evas_object_hide(radio_group); + ap->mf_Status.pRadioGroup = radio_group; + + listby_selected = __mf_popup_get_view_as_selected_item(); + ap->mf_Status.iRadioValue = listby_selected; + + listby_itc.item_style = "1text.1icon.2"; + listby_itc.func.text_get = __mf_popup_view_as_genlist_label_get; + listby_itc.func.content_get = __mf_popup_get_genlist_icon; + listby_itc.func.state_get = NULL; + listby_itc.func.del = __mf_popup_listby_genlist_del; + genlist = elm_genlist_add(popup); + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + elm_object_focus_set(genlist, EINA_FALSE); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + for (index = 0; index < 3; index++) { + Elm_Object_Item *it = NULL; + ListByData_s *item_data = malloc(sizeof(ListByData_s)); + if (item_data == NULL) + continue; + + item_data->index = index; + item_data->unregister_lang_mgr = TRUE; + item_data->ap = ap; + it = elm_genlist_item_append(genlist, &listby_itc, (void *)item_data, NULL, + ELM_GENLIST_ITEM_NONE, __mf_popup_view_as_genlist_select, popup); + item_data->item = it; + mf_language_mgr_register_genlist_item(it); + } + + box = __mf_popup_box_set(popup, genlist, 3); + elm_object_content_set(popup, box); + evas_object_smart_callback_add(popup, "response", func, param); + default: + break; + } + evas_object_show(popup); + return popup; +} + +void mf_popup_indicator_popup(void *data, const char *text) +{ + mf_retm_if(text == NULL, "text is NULL"); + int ret = status_message_post(text); + mf_debug("status_message_post()... [0x%x]!", ret); + if (ret != 0) { + mf_debug("status_message_post()... [0x%x]!", ret); + } else { + + } + return ; + +} diff --git a/src/widget/mf-search-bar.c b/src/widget/mf-search-bar.c new file mode 100644 index 0000000..a71d3db --- /dev/null +++ b/src/widget/mf-search-bar.c @@ -0,0 +1,689 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include + +#include "mf-widget.h" +#include "mf-gengrid.h" +#include "mf-util.h" +#include "mf-dlog.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-launch.h" +#include "mf-language-mgr.h" +#include "mf-tray-item.h" + +#define MF_SEARCH_OPTION_DEF (MF_SEARCH_OPT_DIR | MF_SEARCH_OPT_FILE) +#define MF_SEARCH_ROOT_NUM 1 +#define MF_SEARCH_TIMER_INTERVAL 0.5 + +extern Elm_Genlist_Item_Class itc, userfolderitc; +extern Elm_Genlist_Item_Class categoryitc; + +extern Elm_Gengrid_Item_Class gic; +extern Elm_Gengrid_Item_Class search_itc; +extern int flagSearchMsg; +extern pthread_mutex_t gLockSearchMsg; +extern pthread_cond_t gCondSearchMsg; + +Elm_Gengrid_Item_Class g_search_all_itc; +Elm_Gengrid_Item_Class search_all_itc; + +typedef struct { + char *size; + char *create_date; +} mf_search_detail_infor_s; + +static void __mf_search_bar_click_item(struct appdata *data, GString * path) +{ + MF_TRACE_BEGIN; + struct appdata *ap = data; + assert(ap); + if (ap->mf_Status.path == NULL || ap->mf_Status.path->str == NULL) { + return; + } + GString *new_path = NULL; + + + int error_code = 0; + int mmc_card = 0; + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "get navi structure failed"); + if (ap->mf_Status.search_handler > 0) { + mf_search_stop(ap->mf_Status.search_handler); + mf_search_finalize(&ap->mf_Status.search_handler); + } + + error_code = mf_util_is_mmc_on(&mmc_card); + + if (mf_fm_svc_wrapper_is_dir(path)) { + + if (ap->mf_FileOperation.search_result_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.search_result_list), MYFILE_TYPE_CHAR); + } + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_FALSE); + + ap->mf_Status.view_type = mf_view_normal; + ap->mf_Status.more = MORE_DEFAULT; + new_path = g_string_new(path->str); + mf_debug("path is %s\n", ap->mf_Status.path->str); + + /*set new path*/ + g_string_free(ap->mf_Status.path, TRUE); + ap->mf_Status.path = NULL; + + ap->mf_Status.path = new_path; + + if (pNavi_s->pCurrentPath != NULL) { + free(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = NULL; + } + pNavi_s->pCurrentPath = g_strdup(new_path->str); + mf_widget_refresh_view(ap); + } else { + struct timeval mytime; + gettimeofday(&mytime, NULL); + mf_debug("[myfiles click time] %ld sec %ld usec \n", mytime.tv_sec, mytime.tv_usec); + + int ret = 0; + ret = mf_launch_service(ap, path->str); + mf_debug("ret is %d\n", ret); + if (ret) { + ap->mf_MainWindow.pNormalPopup = + mf_popup_create_popup(ap, POPMODE_TEXT, NULL, GET_SYS_STR(MF_LABEL_UNSUPPORT_FILE_TYPE), NULL, NULL, NULL, NULL, NULL); + } + } + MF_TRACE_END; +} + +static void __mf_search_bar_item_sel(void *data, Evas_Object * obj, void *event_info) +{ + mf_debug("Start"); + assert(data); + + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + + elm_genlist_item_selected_set(item, FALSE); + __mf_search_bar_click_item(data, selected->m_ItemName); + } +} + +static void __mf_search_bar_grid_item_sel(void *data, Evas_Object * obj, void *event_info) +{ + Elm_Object_Item *item = (Elm_Object_Item *) event_info; + if (item != NULL) { + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + mf_retm_if(selected == NULL, "selected is NULL"); + mf_retm_if(selected->m_ItemName == NULL, "selected->m_ItemName is NULL"); + mf_retm_if(selected->m_ItemName->str == NULL, "selected->m_ItemName->str is NULL"); + + __mf_search_bar_click_item(data, selected->m_ItemName); + } +} + +static void __mf_search_bar_sel_search_all(void *data, Evas_Object * obj, void *event_info) +{ + mf_search_bar_search_started_callback(data, NULL, NULL); +} + +static Evas_Object *_gl_content_get(void *data, Evas_Object * obj, const char *part) +{ + + mf_debug("part is [%s]", part); + if (!strcmp(part, "elm.icon")) { + Evas_Object *btn = elm_button_add(obj); + elm_object_text_set(btn, GET_STR(MF_LABEL_SEARCH_ALL)); + evas_object_smart_callback_add(btn, "clicked", __mf_search_bar_sel_search_all, data); + + return btn; + } else if(!strcmp(part, "elm.swallow.icon")) { + Evas_Object *btn = elm_button_add(obj); + elm_object_text_set(btn, GET_STR(MF_LABEL_SEARCH_ALL)); + evas_object_smart_callback_add(btn, "clicked", __mf_search_bar_sel_search_all, data); + return btn; + } + return NULL; +} + + +void mf_search_bar_search_all_item_append(void *data) +{ + + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input data error"); + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_THUMBNAIL) { + + Elm_Gengrid_Item_Class *itc = elm_gengrid_item_class_new(); + itc->item_style = "default_gridtext"; + itc->func.text_get = NULL; + itc->func.content_get = _gl_content_get; + itc->func.state_get = NULL; + itc->func.del = NULL; + + elm_gengrid_item_append(ap->mf_MainWindow.pNaviGengrid, itc, ap, NULL, NULL); + + } else { + Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new(); + itc->item_style = "1icon"; + itc->func.text_get = NULL; + itc->func.content_get = _gl_content_get; + itc->func.state_get = NULL; + itc->func.del = NULL; + elm_genlist_item_append(ap->mf_MainWindow.pNaviGenlist, itc, ap, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + ap->mf_Status.flagSearchAll = EINA_TRUE; +} +void mf_search_bar_item_append(void *data, void *user_data) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)user_data; + mf_retm_if(ap == NULL, "input data error"); + char *item_name = (char *)data; + mf_retm_if(item_name == NULL, "input item_name error"); + mfItemData_s *m_TempItem = NULL; + + GString *search_path = g_string_new(item_name); + + g_string_free(search_path, TRUE); + search_path = NULL; + if (ap->mf_Status.view_type == mf_view_root_category && ap->mf_Status.more != MORE_SEARCH) { + mf_util_generate_list(&ap->mf_FileOperation.category_list, item_name, FILE_TYPE_FILE); + } + m_TempItem = (mfItemData_s *) malloc(sizeof(mfItemData_s)); + + if (m_TempItem == NULL) { + return; + } + memset(m_TempItem, 0, sizeof(mfItemData_s)); + + m_TempItem->m_ItemName = g_string_new(item_name); + m_TempItem->size = NULL; + m_TempItem->create_date = NULL; + m_TempItem->m_checked = FALSE; + m_TempItem->pCheckBox = NULL; + m_TempItem->thumb_path = NULL; + m_TempItem->real_thumb_flag = FALSE; + m_TempItem->unregister_lang_mgr = TRUE; + m_TempItem->media = NULL; + m_TempItem->ap = ap; + + /*delete timer if exists*/ + + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_THUMBNAIL) { + Elm_Object_Item *git = NULL; + git = elm_gengrid_item_append(ap->mf_MainWindow.pNaviGengrid, &gic, m_TempItem, __mf_search_bar_grid_item_sel, ap); + mf_language_mgr_register_gengrid_item(git); + m_TempItem->item = git; + } + else + { + Elm_Object_Item *it = NULL; + if (ap->mf_Status.view_type == mf_view_root_category && ap->mf_Status.more != MORE_SEARCH) { + it = elm_genlist_item_append(ap->mf_MainWindow.pNaviGenlist, &categoryitc, m_TempItem, NULL, + ELM_GENLIST_ITEM_NONE, mf_genlist_gl_sel, m_TempItem); + } else { + it = elm_genlist_item_append(ap->mf_MainWindow.pNaviGenlist, &search_itc, m_TempItem, NULL, + ELM_GENLIST_ITEM_NONE, __mf_search_bar_item_sel, ap); + } + m_TempItem->item = it; + } + + mf_debug("get is [%d]", elm_genlist_items_count(ap->mf_MainWindow.pNaviGenlist)); + MF_TRACE_END; + +} + +static void __mf_search_bar_result_cb(mf_search_result_t *result, void *user_data) +{ + MF_TRACE_BEGIN; + mf_retm_if(result == NULL, "result is NULL"); + + struct appdata *ap = (struct appdata *)user_data; + mf_retm_if(ap == NULL, "ap is NULL"); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "pNavi_s is NULL"); + + Evas_Object *pSearchBarLabel = NULL; + + if (ap->mf_Status.view_type != mf_view_root_category) { + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_TRUE); + } + +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_FileOperation.search_result_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.search_result_list), MYFILE_TYPE_CHAR); + } +#endif + if (ap->mf_Status.view_type == mf_view_root_category && ap->mf_Status.more != MORE_SEARCH) { + if (ap->mf_FileOperation.category_list) { + mf_util_free_eina_list_with_data(&(ap->mf_FileOperation.category_list), MYFILE_TYPE_FSNODE); + } + } + + if (g_list_length(result->dir_list) + g_list_length(result->file_list) == 0) { + + Evas_Object *parent = NULL; + parent = ap->mf_MainWindow.pNaviLayout; + ap->mf_Status.flagNoContent = EINA_TRUE; + pSearchBarLabel = mf_widget_create_no_content(parent); + elm_object_part_text_set(pSearchBarLabel, "elm.text", GET_SYS_STR(LABEL_NO_RESULT)); + + if (ap->mf_Status.view_type != mf_view_root_category) { + elm_object_part_content_set(parent, "content", pSearchBarLabel); + } else { + elm_object_part_content_set(parent, "content", pSearchBarLabel); + Evas_Object *btn = mf_widget_get_part_content(ap->mf_MainWindow.pNaviBar, NAVI_BOTTOM_BUTTON_1_PART); + elm_object_disabled_set(btn, EINA_TRUE); + } + + } else { + ap->mf_Status.flagNoContent = EINA_FALSE; + if (ap->mf_Status.view_type == mf_view_root_category && ap->mf_Status.more != MORE_SEARCH) { + mf_genlist_set_category_list_style(); + mf_navi_bar_title_set(ap); + } + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + if (ap->mf_MainWindow.pNaviGenlist == NULL) { + ap->mf_MainWindow.pNaviGenlist = elm_genlist_add(ap->mf_MainWindow.pNaviLayout); + } + elm_genlist_clear(ap->mf_MainWindow.pNaviGenlist); + + elm_genlist_mode_set(ap->mf_MainWindow.pNaviGenlist, ELM_LIST_COMPRESS); + elm_object_focus_set(ap->mf_MainWindow.pNaviGenlist, EINA_FALSE); + evas_object_size_hint_weight_set(ap->mf_MainWindow.pNaviGenlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ap->mf_MainWindow.pNaviGenlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + + //elm_genlist_homogeneous_set(ap->mf_MainWindow.pNaviGenlist, EINA_TRUE); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,right", mf_genlist_gl_mode_sweep_set, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,left", mf_genlist_gl_mode_sweep_unset, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,up", mf_genlist_gl_mode_cancel, ap); + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,start,down", mf_genlist_gl_mode_cancel, ap); + //evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "drag,stop", mf_genlist_gl_mode_sweep_stop, NULL); + if (ap->mf_Status.view_type == mf_view_root_category && ap->mf_Status.more != MORE_SEARCH) { + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviGenlist, "selected", mf_genlist_gl_selected, ap); + } + evas_object_show(ap->mf_MainWindow.pNaviGenlist); + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, ap->mf_MainWindow.pNaviGenlist); + } else { + if (ap->mf_MainWindow.pNaviGengrid == NULL) { + ap->mf_MainWindow.pNaviGengrid = mf_gengrid_create_grid(ap->mf_MainWindow.pNaviLayout); + } + elm_gengrid_clear(ap->mf_MainWindow.pNaviGengrid); + elm_gengrid_item_size_set(ap->mf_MainWindow.pNaviGengrid, MF_HD_GENGRID_ITEM_WIDTH, MF_HD_GENGRID_ITEM_HEIGTH); + evas_object_show(ap->mf_MainWindow.pNaviGengrid); + mfNaviBarSetContent(ap, ap->mf_MainWindow.pNaviLayout, ap->mf_MainWindow.pNaviGengrid); + } + if (result->dir_list != NULL) { + g_list_foreach(result->dir_list, mf_search_bar_item_append, ap); + } + if (result->file_list != NULL) { + g_list_foreach(result->file_list, mf_search_bar_item_append, ap); + } + MF_TRACE_END; + } +} + +static void __mf_search_bar_stop_cb(void *data, Evas_Object * obj, void *event_info) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input data error"); + + Evas_Object *btn = (Evas_Object *)obj; + const char *label = elm_object_text_get(btn); + + if (g_strcmp0(label, GET_SYS_STR(LABEL_CANCEL)) == 0 ) { + if (ap->mf_FileOperation.sync_pipe != NULL) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + + __mf_search_bar_result_cb(((ms_handle_t *) ap->mf_Status.search_handler)->result, ap); + + if (ap->mf_Status.search_handler > 0) { + mf_search_stop(ap->mf_Status.search_handler); + } + + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + + if (ap->mf_Status.search_handler > 0) { + mf_search_finalize(&ap->mf_Status.search_handler); + } + } +} + +static int __mf_search_bar_idle_search_msg_cope_finished(void *data) +{ + pthread_mutex_lock(&gLockSearchMsg); + if (flagSearchMsg == 0) { + flagSearchMsg = 1; + pthread_cond_signal(&gCondSearchMsg); + } + pthread_mutex_unlock(&gLockSearchMsg); + + return ECORE_CALLBACK_CANCEL; +} + +static void __mf_search_bar_pipe_cb(void *data, void *buffer, unsigned int nbyte) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + if (ap == NULL) { + mf_debug("input ap is NULL"); + goto MF_CONTINURE_SEARCH; + } + + mf_search_pipe_msg *pSearchMsg = (mf_search_pipe_msg *) buffer; + if (pSearchMsg == NULL) { + mf_debug("received message is NULL"); + goto MF_CONTINURE_SEARCH; + } + + if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_RESULT_REPORT) { + mf_debug("result get"); + } else if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_ROOT_CHANGE) { + mf_debug("path change %s", pSearchMsg->current_path); + char *new_desc = mf_fm_svc_wrapper_translate_path(pSearchMsg->current_path, MF_TRANS_OPTION_POPUP); + elm_object_part_text_set(ap->mf_MainWindow.pSearchLabel, "elm.swallow.content", new_desc); + + //edje_object_part_text_set(elm_layout_edje_get(ap->mf_MainWindow.pSearchLabel), "elm.swallow.content", new_desc); + SAFE_FREE_CHAR(pSearchMsg->current_path); + SAFE_FREE_CHAR(new_desc); + } else if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_FINISHED) { + evas_object_del(ap->mf_MainWindow.pNormalPopup); + ap->mf_MainWindow.pNormalPopup = NULL; + __mf_search_bar_result_cb((mf_search_result_t *) pSearchMsg->report_result, data); + } + +MF_CONTINURE_SEARCH: + ecore_idler_add((Ecore_Task_Cb)__mf_search_bar_idle_search_msg_cope_finished, NULL); + MF_TRACE_END; +} + +void mf_search_bar_category_search_start(void *data, int category) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata *)data; + int root_num = MF_SEARCH_ROOT_NUM; + + mf_genlist_create_search_itc(); + + root_num = 1; + const char *SearchRoot[3] = {0}; + SearchRoot[0] = PHONE_FOLDER; + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + SearchRoot[root_num] = MEMORY_FOLDER; + root_num++; + } + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + SearchRoot[root_num] = OTG_FOLDER; + root_num++; + } + + char *new_desc = NULL; + /*Start Search routine*/ + if (!mf_search_start(ap->mf_Status.search_handler, SearchRoot, root_num, \ + NULL, MF_SEARCH_OPT_FILE, (void *)ap, mf_tray_item_type, category)) { + /*generate the popup used to show search path + **it's sure that new_desc is not NULL even if original path is NULL*/ + new_desc = mf_fm_svc_wrapper_translate_path(ap->mf_Status.path->str, MF_TRANS_OPTION_POPUP); + ap->mf_MainWindow.pNormalPopup = mf_ug_popup_create_search(ap, __mf_search_bar_stop_cb, ap); + } else { + mf_debug("search failed"); + } + + if (new_desc != NULL) { + free(new_desc); + new_desc = NULL; + } + + MF_TRACE_END; +} +static bool __mf_search_bar_idle_search_start(void *data) +{ + struct appdata *ap = (struct appdata *)data; + assert(ap); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + if (pNavi_s == NULL) { + ap->mf_FileOperation.search_IME_hide_timer = NULL; + mf_debug("pNavi_s is NULL"); + return ECORE_CALLBACK_CANCEL; + } + + { + + int root_num = 0; + mf_genlist_create_search_itc(); + + char *text = NULL; + const char *SearchRoot[3] = {0}; + if (ap->mf_Status.more == MORE_SEARCH) { + text = g_strdup(elm_object_text_get(ap->mf_MainWindow.pSearchEntry)); + } + + if (ap->mf_Status.view_type == mf_view_root || ap->mf_Status.view_type == mf_view_root_category) { + SearchRoot[0] = PHONE_FOLDER; + root_num++; + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + SearchRoot[root_num] = MEMORY_FOLDER; + root_num++; + } + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + SearchRoot[root_num] = OTG_FOLDER; + root_num++; + } + } else { + if (ap->mf_Status.flagSearchAll == EINA_FALSE) { + SearchRoot[0] = ap->mf_Status.path->str; + root_num++; + } else { + int root = mf_fm_svc_wrapper_is_root_path(ap->mf_Status.path->str); + switch (root) { + case MYFILE_PHONE: + SearchRoot[0] = PHONE_FOLDER; + break; + case MYFILE_MMC: + SearchRoot[0] = MEMORY_FOLDER; + break; + case MYFILE_OTG: + SearchRoot[0] = OTG_FOLDER; + break; + default: + SearchRoot[0] = PHONE_FOLDER; + break; + } + root_num++; + } + } + mf_debug("search root is %s text is [%s]", ap->mf_Status.path->str, text); + char *new_desc = NULL; + /*Start Search routine*/ + if (!mf_search_start(ap->mf_Status.search_handler, SearchRoot, root_num, \ + ((text) ? text : NULL), MF_SEARCH_OPTION_DEF, (void *)ap, NULL, mf_tray_item_category_none)) { + /*generate the popup used to show search path + **it's sure that new_desc is not NULL even if original path is NULL*/ + new_desc = mf_fm_svc_wrapper_translate_path(ap->mf_Status.path->str, MF_TRANS_OPTION_POPUP); + ap->mf_MainWindow.pNormalPopup = mf_ug_popup_create_search(ap, __mf_search_bar_stop_cb, ap); + } + + if (new_desc != NULL) { + free(new_desc); + new_desc = NULL; + } + + if (text != NULL) { + free(text); + text = NULL; + } + + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + return ECORE_CALLBACK_CANCEL; +} + +void mf_search_bar_enter_search_routine(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + assert(ap); + + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } + + if (ap->mf_Status.more != MORE_DEFAULT) { + return; + } + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + + if (ap->mf_FileOperation.search_IME_hide_timer != NULL) { + ecore_timer_del(ap->mf_FileOperation.search_IME_hide_timer); + ap->mf_FileOperation.search_IME_hide_timer = NULL; + } + + ap->mf_Status.more = MORE_SEARCH; + ap->mf_Status.flagSearchAll = EINA_FALSE; + + mf_navi_bar_create_search_view(ap); + MF_TRACE_END; +} + +void mf_search_bar_category_search(void *data, int category) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input data error"); + SAFE_FREE_CHAR(ap->mf_Status.search_filter); + if (ap->mf_Status.search_handler > 0) + mf_search_finalize(&ap->mf_Status.search_handler); + int ret = mf_search_init(&ap->mf_Status.search_handler); + mf_retm_if(ret < 0, "Fail to mf_search_init()"); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "input data error"); + + evas_object_del(mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "content")); + Evas_Object *tray = mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "swallow.shortcut"); + SAFE_FREE_OBJ(tray); + ap->mf_MainWindow.pNaviGengrid = NULL; + ap->mf_MainWindow.pNaviGenlist = NULL; + + if (ap->mf_FileOperation.sync_pipe != NULL) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + ap->mf_FileOperation.sync_pipe = ecore_pipe_add(__mf_search_bar_pipe_cb, ap); + + if (ap->mf_FileOperation.sync_pipe == NULL) { + mf_debug("add pipe failed"); + } + /*this is to init global variable to ensure the first message can be transmitted correctly*/ + /*flagSearchMsg is to indicate the condition wait to sync data of threads*/ + pthread_mutex_lock(&gLockSearchMsg); + flagSearchMsg = 1; + pthread_mutex_unlock(&gLockSearchMsg); + + /*delete guide text label in the box*/ + mf_search_bar_category_search_start(ap, category); + mf_debug("enter pressed %d", category); + MF_TRACE_END; + +} +void mf_search_bar_search_started_callback(void *data, Evas_Object * obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "input data error"); + + char *text = g_strdup(elm_object_text_get(ap->mf_MainWindow.pSearchEntry)); + if (text == NULL || strlen(text) == 0 || strlen(g_strstrip(text)) == 0) { + g_free(text); + text = NULL; + SAFE_FREE_CHAR(ap->mf_Status.search_filter); + return; + } + + g_free(text); + text = NULL; + + SAFE_FREE_CHAR(ap->mf_Status.search_filter); + ap->mf_Status.search_filter = g_strdup(elm_object_text_get(ap->mf_MainWindow.pSearchEntry)); + if (ap->mf_Status.more == MORE_RENAME) { + mf_genlist_rename_done(ap, NULL, NULL); + return; + } + + if (ap->mf_Status.search_handler > 0) + mf_search_finalize(&ap->mf_Status.search_handler); + int ret = mf_search_init(&ap->mf_Status.search_handler); + mf_retm_if(ret < 0, "Fail to mf_search_init()"); + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + mf_retm_if(pNavi_s == NULL, "input data error"); + + /*hide the IME*/ + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_FALSE); + + /*delete guide text label in the box*/ + evas_object_del(mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, "content")); + + ap->mf_MainWindow.pNaviGengrid = NULL; + ap->mf_MainWindow.pNaviGenlist = NULL; + + if (ap->mf_FileOperation.sync_pipe != NULL) { + ecore_pipe_del(ap->mf_FileOperation.sync_pipe); + ap->mf_FileOperation.sync_pipe = NULL; + } + ap->mf_FileOperation.sync_pipe = ecore_pipe_add(__mf_search_bar_pipe_cb, ap); + + if (ap->mf_FileOperation.sync_pipe == NULL) { + mf_debug("add pipe failed"); + } + /*this is to init global variable to ensure the first message can be transmitted correctly*/ + /*flagSearchMsg is to indicate the condition wait to sync data of threads*/ + pthread_mutex_lock(&gLockSearchMsg); + flagSearchMsg = 1; + pthread_mutex_unlock(&gLockSearchMsg); + + elm_object_focus_set(ap->mf_MainWindow.pSearchEntry, EINA_FALSE); + /*delete guide text label in the box*/ + ap->mf_FileOperation.search_IME_hide_timer = ecore_timer_add(MF_SEARCH_TIMER_INTERVAL, (Ecore_Task_Cb)__mf_search_bar_idle_search_start, ap); + mf_debug("enter pressed"); + MF_TRACE_END; + + return; +} diff --git a/src/widget/mf-split-view.c b/src/widget/mf-split-view.c new file mode 100644 index 0000000..83ab68d --- /dev/null +++ b/src/widget/mf-split-view.c @@ -0,0 +1,356 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "mf-main.h" +#include "mf-widget.h" +#include "mf-callback.h" +#include "mf-fm-svc-wrapper.h" +//double wscale = (double)(((double)w) / ((double)GL_WIN_WIDTH)); +#define LEFT_SCALE 0.4 +#define LEFT_W (800*LEFT_SCALE) +#define LEFT_H (480) + +#ifdef MYFILE_SPLIT_VIEW + +static void _gl_con(void *data, Evas_Object *obj, void *event_info); +static void _gl_exp_ndepth(void *data, Evas_Object *obj, void *event_info); + +void mf_split_view_unset_right_content(void *data) +{ + + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + Evas_Object *unset = NULL; + + unset = mf_widget_unset_part_content(ap->mf_MainWindow.sSplitData.pPanes, "right"); + if (unset) + evas_object_hide(unset); + MF_TRACE_END; +} + + +void mf_split_view_path_info_update(Evas_Object *label, const char *fullpath, Eina_Bool root) +{ + MF_TRACE_BEGIN; + mf_retm_if(label == NULL, "label is NULL"); + mf_retm_if(fullpath == NULL, "path_info is NULL"); + char *pathinfo = NULL; + char *info = NULL; + + if (root) { + info = g_strdup("Root"); + } else { + pathinfo = mf_fm_svc_path_info_get(fullpath); + info = mf_fm_svc_path_info_translate(pathinfo, MF_PATH_INFO_MAX_LENGTH_LANDSCAPE); + } + + elm_object_part_text_set(label, "info", info); + MF_TRACE_END; +} + + +void mf_split_view_init(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + Evas_Object *pLeftGenlist = NULL; + /*** create the panes */ + + ap->mf_MainWindow.sSplitData.pPanes = mf_widget_create_panes(ap->mf_MainWindow.pMainLayout); + evas_object_show(ap->mf_MainWindow.sSplitData.pPanes); + + ap->mf_MainWindow.sSplitData.pMainLayout = mf_widget_create_layout_main(ap->mf_MainWindow.sSplitData.pPanes); + + /**Set left size*/ + elm_panes_content_left_size_set(ap->mf_MainWindow.sSplitData.pPanes, LEFT_SCALE); + + + /** create the left folder genlist **/ + pLeftGenlist = mf_widget_create_genlist(ap->mf_MainWindow.sSplitData.pPanes); + evas_object_smart_callback_add(pLeftGenlist, "expanded", _gl_exp_ndepth, ap); + evas_object_smart_callback_add(pLeftGenlist, "contracted", _gl_con, ap); + + //mf_widget_resize(pLeftGenlist, LEFT_W, LEFT_H); + ap->mf_MainWindow.sSplitData.pSplitLeftGenlist = pLeftGenlist; + evas_object_show(pLeftGenlist); + + elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pPanes, "left", pLeftGenlist); + + ap->mf_MainWindow.sSplitData.bFlagSplitViewCreate = TRUE; + MF_TRACE_END; + +} +void mf_split_view_destory(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + //SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSelectAllCheckBox); + //SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSelectAllLayout); + SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist); + SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pPanes); + SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pMainLayout); + ap->mf_MainWindow.sSplitData.bFlagSplitViewCreate = FALSE; + MF_TRACE_END; +} + +void mf_split_view_hide(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + evas_object_hide(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist); + evas_object_hide(ap->mf_MainWindow.sSplitData.pPanes); + evas_object_hide(ap->mf_MainWindow.sSplitData.pMainLayout); + MF_TRACE_END; +} + +void mf_split_view_show(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + evas_object_show(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist); + evas_object_show(ap->mf_MainWindow.sSplitData.pPanes); + evas_object_show(ap->mf_MainWindow.sSplitData.pMainLayout); + MF_TRACE_END; +} + +void mf_split_view_genlist_append(void *data, Evas_Object *pGenlist, GString *fullpath, Elm_Object_Item *parent_item) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + Elm_Object_Item *parent = NULL; + Eina_List *dir_list = NULL; + Eina_List *file_list = NULL; + mfItemData_s *it_data; + int iSortTypeValue = 0; + it_data = elm_object_item_data_get(parent_item); + mf_retm_if(it_data == NULL, "it_data is NULL"); + mf_retm_if(it_data->m_ItemName == NULL, "it_data->m_ItemName is NULL"); + mf_retm_if(it_data->m_ItemName->str == NULL, "it_data->m_ItemName->str is NULL"); + + mf_debug("fullpath is [%s] item is [%s]", fullpath->str, it_data->m_ItemName->str); + + mf_fm_svc_wrapper_get_file_list(it_data->m_ItemName->str, &dir_list, &file_list); + + + mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue); + + mf_fs_oper_sort_list(&file_list, iSortTypeValue); + + if (iSortTypeValue == MYFILE_SORT_BY_NAME_A2Z || iSortTypeValue == MYFILE_SORT_BY_NAME_Z2A || iSortTypeValue == MYFILE_SORT_BY_DATE_R2O + || iSortTypeValue == MYFILE_SORT_BY_DATE_O2R) { + mf_fs_oper_sort_list(&dir_list, iSortTypeValue); + } else { + mf_fs_oper_sort_list(&dir_list, ap->mf_Status.iFolderSortType); + } + if (dir_list == NULL || eina_list_count(dir_list) == 0) { + MF_TRACE_END; + return; + } + + if (g_string_equal(fullpath, it_data->m_ItemName)) { + it_data->flagExpand = true; + elm_object_item_data_set(it_data->item, it_data); + + elm_genlist_item_update(it_data->item); + mf_genlist_split_left_items_append(ap, pGenlist, parent_item, dir_list); + + MF_TRACE_END; + return; + } else { + it_data->flagExpand = true; + elm_object_item_data_set(it_data->item, it_data); + + elm_genlist_item_update(it_data->item); + parent = mf_genlist_split_left_items_append(ap, pGenlist, parent_item, dir_list); + mf_split_view_genlist_append(ap, pGenlist, fullpath, parent); + } + MF_TRACE_END; + +} + +Elm_Object_Item *mf_split_view_locate_item_get(void *data, int locate) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Elm_Object_Item *item = NULL; + + switch (locate) { + case MYFILE_MMC: + item = ap->mf_MainWindow.sSplitData.mmc_item; + break; + case MYFILE_OTG: + item = ap->mf_MainWindow.sSplitData.otg_item; + break; + case MYFILE_PHONE: + default: + item = ap->mf_MainWindow.sSplitData.phone_item; + break; + } + return item; +} + +static void _gl_con(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + if (ap->mf_Status.more != MORE_EDIT && ap->mf_Status.more != MORE_SHARE_EDIT) { + Elm_Object_Item *item = event_info; + elm_genlist_item_subitems_clear(item); + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + mf_error("g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str) %d", g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str)); + if (g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str)) { + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(selected->m_ItemName->str); + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = g_strdup(selected->m_ItemName->str); + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) { + mf_navi_bar_create_path_select_view(ap); + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + } + } + + } + MF_TRACE_END; +} + +static void _gl_exp_ndepth(void *data, Evas_Object *obj, void *event_info) +{ + MF_TRACE_BEGIN; + struct appdata *ap = (struct appdata *)data; + Elm_Object_Item *item = event_info; + + if (item != NULL) { + mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item); + //elm_genlist_item_selected_set(item, FALSE); + + if (ap->mf_Status.flagNaviPush) { + mf_debug("the transition of the naviframe is not finished"); + return; + } + SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup); + if (ap->mf_Status.more == MORE_RENAME) { + if (elm_genlist_item_flip_get(item)) { + MF_TRACE_END; + return; + } else { + mf_callback_rename_save_cb(ap, NULL, NULL); + return; + } + } else if (ap->mf_Status.more != MORE_EDIT && ap->mf_Status.more != MORE_SHARE_EDIT) { + if (g_string_equal(selected->m_ItemName, ap->mf_Status.path)) { + + myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap); + SAFE_FREE_GSTRING(ap->mf_Status.path); + ap->mf_Status.path = g_string_new(selected->m_ItemName->str); + SAFE_FREE_CHAR(pNavi_s->pCurrentPath); + pNavi_s->pCurrentPath = g_strdup(selected->m_ItemName->str); + + mf_split_view_genlist_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist, + ap->mf_Status.path, item); + } else { + mf_split_view_genlist_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist, + ap->mf_Status.path, item); + if (!g_string_equal(selected->m_ItemName, ap->mf_Status.path)) { + mf_callback_left_click_cb(data, selected->m_ItemName, item); + } + + } + + } + } + + MF_TRACE_END; +} + +void mf_split_view_left_genlist_refresh(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + Evas_Object *pGenlist = NULL; + + GString *fullpath = ap->mf_Status.path; + mf_retm_if(fullpath == NULL, "fullpath is NULL"); + //Eina_List *dir_list = NULL; + + + mf_widget_unset_part_content(ap->mf_MainWindow.sSplitData.pPanes, "left"); + SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist); + /** create the left folder genlist **/ + pGenlist = mf_widget_create_genlist(ap->mf_MainWindow.sSplitData.pPanes); + evas_object_smart_callback_add(pGenlist, "expanded", _gl_exp_ndepth, ap); + evas_object_smart_callback_add(pGenlist, "contracted", _gl_con, ap); + + //mf_widget_resize(pLeftGenlist, LEFT_W, LEFT_H); + ap->mf_MainWindow.sSplitData.pSplitLeftGenlist = pGenlist; + + //elm_genlist_mode_set(pGenlist, ELM_LIST_SCROLL); /* Back to default */ + //elm_scroller_policy_set(pGenlist,EINA_TRUE, EINA_TRUE); + evas_object_show(pGenlist); + + elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pPanes, "left", pGenlist); + + + //pGenlist = ap->mf_MainWindow.sSplitData.pSplitLeftGenlist; + mf_retm_if(pGenlist == NULL, "pGenlist is NULL"); + Elm_Object_Item *parent_item = NULL; + mf_genlist_clear(pGenlist); + mf_genlist_split_left_genlist_style(ap); + mf_genlist_split_root_items_append(pGenlist, ap); + + + int locate = mf_fm_svc_wrapper_get_location(fullpath->str); + + parent_item = mf_split_view_locate_item_get(ap, locate); + + mf_split_view_genlist_append(ap, pGenlist, fullpath, parent_item); + //error_code = mf_fm_svc_wrapper_get_file_list(path, &dir_list, file_list); + MF_TRACE_END; +} + +bool mf_split_view_refresh(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, FALSE, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + //update the left genlist items + mf_split_view_left_genlist_refresh(ap); + + MF_TRACE_END; + return TRUE; + +} +#endif diff --git a/src/widget/mf-tab-bar.c b/src/widget/mf-tab-bar.c new file mode 100644 index 0000000..95966fe --- /dev/null +++ b/src/widget/mf-tab-bar.c @@ -0,0 +1,334 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include "mf-widget.h" +#include "mf-callback.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-util.h" +#include "mf-language-mgr.h" +#include "mf-ta.h" + +/****************************** +** Prototype : mf_tab_bar_create_tab_bar +** Description : Samsung +** Input : Evas_Object *parent +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Evas_Object *mf_tab_bar_create_tab_bar(Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retv_if(parent == NULL, NULL); + Evas_Object *toolbar = elm_toolbar_add(parent); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_object_style_set(toolbar, "tabbar"); + //elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); + elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE); + //set_rotate_cb_for_winset(__rotate_tabbar_cb, toolbar); + MF_TRACE_END; + return toolbar; +} + +Evas_Object *mf_tab_bar_create_tab_layout(Evas_Object *tab_bar) +{ + Evas_Object *layout = elm_layout_add(tab_bar); + elm_layout_theme_set(layout, "layout", "tabbar", "default"); + return layout; + +} +/****************************** +** Prototype : mf_tab_bar_append_item +** Description : Samsung +** Input : Evas_Object *pTabBar +** char *pTabIconPath +** char *pTabBarLabel +** Evas_Object *pTabView +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Elm_Object_Item *mf_tab_bar_append_item(Evas_Object *pTabBar, char *pTabIconPath, char *pTabBarLabel, void *user_data) +{ + mf_retv_if(pTabBar == NULL, NULL); + Elm_Object_Item *pItem = NULL; + //pItem = elm_toolbar_item_append(pTabBar, pTabIconPath, pTabBarLabel, mf_callback_tab_cb, user_data); + return pItem; +} + + + +/****************************** +** Prototype : mf_tab_bar_set_item_view +** Description : Samsung +** Input : Elm_Object_Item *it +** Evas_Object * view +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_tab_bar_set_item_view(Evas_Object *parent, Evas_Object *tab_layout, Evas_Object *view) +{ + MF_TRACE_BEGIN; + mf_retm_if(parent == NULL, "parent is NULL"); + mf_retm_if(tab_layout == NULL, "tab_layout is NULL"); + mf_retm_if(view == NULL, "view is NULL"); + Evas_Object *layout = tab_layout; + Evas_Object *unset = elm_object_part_content_get(layout, "elm.swallow.content"); + if (unset) { + mf_widget_unset_part_content(layout, "elm.swallow.content"); + evas_object_hide(unset); + } + + elm_object_part_content_set(layout, "elm.swallow.content", view); + MF_TRACE_END; +} + + +/****************************** +** Prototype : mf_tab_bar_get_item_by_label +** Description : Samsung +** Input : Evas_Object *pTabBar +** char *pTabLabel +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +Elm_Object_Item *mf_tab_bar_get_item_by_label(Evas_Object *pTabBar, char *pTabLabel) +{ + mf_retvm_if(pTabBar == NULL, NULL, "pTabBar is NULL"); + mf_retvm_if(pTabLabel == NULL, NULL, "pTabLabel is NULL"); + Elm_Object_Item *pItem = NULL; + + pItem = elm_toolbar_first_item_get(pTabBar); + while(pItem) { + if (g_strcmp0(pTabLabel, elm_object_item_text_get(pItem)) == 0) { + return pItem; + } + pItem = elm_toolbar_item_next_get(pItem); + } + return NULL; +} + + +/****************************** +** Prototype : mf_tab_bar_remove_item_by_label +** Description : Samsung +** Input : Evas_Object *pTabBar +** char *pTabLabel +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_tab_bar_remove_item_by_label(Evas_Object *pTabBar, char *pTabLabel) +{ + Elm_Object_Item *pItem = NULL; + pItem = elm_toolbar_first_item_get(pTabBar); + + while(pItem) { + if (g_strcmp0(pTabLabel, elm_object_item_text_get(pItem)) == 0) { + mf_language_mgr_unregister_object_item(pItem); + elm_object_item_del(pItem); + return; + } + pItem = elm_toolbar_item_next_get(pItem); + } +} + + +/****************************** +** Prototype : mf_tab_bar_set_selected_item +** Description : Samsung +** Input : Elm_Object_Item* pItem +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_tab_bar_set_selected_item(Elm_Object_Item *pItem) +{ + mf_retm_if(pItem == NULL, "pItem is NULL"); + elm_toolbar_item_selected_set(pItem, EINA_TRUE); +} + + +/****************************** +** Prototype : mf_tab_bar_set_item_disabled +** Description : Samsung +** Input : Evas_Object *pTabBar +** Eina_Bool disable +** Output : None +** Return Value : +** Calls : +** Called By : +** +** History : +** 1.Date : 2010/12/10 +** Author : Samsung +** Modification : Created function +** +******************************/ +void mf_tab_bar_set_item_disabled(Evas_Object *pTabBar, Eina_Bool disable) +{ + Elm_Object_Item *pCurrentItem = NULL; + if (pTabBar != NULL) { + + pCurrentItem = elm_toolbar_first_item_get(pTabBar); + while(pCurrentItem) { + elm_object_item_disabled_set(pCurrentItem, disable); + pCurrentItem = elm_toolbar_item_next_get(pCurrentItem); + } + } +} + + +int mf_tab_bar_items_count_get(Evas_Object *pTabBar) +{ + mf_retvm_if(pTabBar == NULL, 0, "pTabBar is NULL"); + + Elm_Object_Item *pCurrentItem = NULL; + int count = 0; + + pCurrentItem = elm_toolbar_first_item_get(pTabBar); + while(pCurrentItem) { + count++; + pCurrentItem = elm_toolbar_item_next_get(pCurrentItem); + } + + return count; +} + +void mf_tab_bar_items_del(Evas_Object *pTabBar) +{ + mf_retm_if(pTabBar == NULL, "pTabBar does not exist"); + Elm_Object_Item *it = NULL; + Elm_Object_Item *pNext = NULL; + + it = elm_toolbar_first_item_get(pTabBar); + while(it) { + pNext = elm_toolbar_item_next_get(it); + mf_language_mgr_unregister_object_item(it); + elm_object_item_del(it); + it = pNext; + } +} + +void mf_tab_bar_generate(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Evas_Object *pContent = NULL; + Elm_Object_Item *pItem = NULL; + + MF_TA_ACUM_ITEM_END(" storage check", 0); + if (ap->mf_Status.iStorageState > MYFILE_PHONE) { + MF_TA_ACUM_ITEM_BEGIN(" create_tabbar", 0); + Evas_Object *parent = ap->mf_MainWindow.pNaviBar; + /*create tab bar**/ + MF_TA_ACUM_ITEM_BEGIN(" mf_tab_bar_create_tab_bar", 0); + if (ap->mf_MainWindow.pTabBar == NULL) { + ap->mf_MainWindow.pTabBar = mf_tab_bar_create_tab_bar(parent); + } + MF_TA_ACUM_ITEM_END(" mf_tab_bar_create_tab_bar", 0); + + MF_TA_ACUM_ITEM_BEGIN(" tab bar content set", 0); + + pContent = ap->mf_MainWindow.pTabBar; + MF_TA_ACUM_ITEM_BEGIN(" tab bar phone item add", 0); + + MF_TA_ACUM_ITEM_BEGIN(" set phone item", 0); + if(!mf_tab_bar_get_item_by_label(pContent, GET_SYS_STR(MF_LABEL_PHONE))) { + pItem = mf_tab_bar_append_item(pContent, MF_ICON_PHONE, GET_SYS_STR(MF_LABEL_PHONE), ap); + mf_language_mgr_register_object_item(pItem, MF_LABEL_PHONE, ITEM_TYPE_TAB); + } + MF_TA_ACUM_ITEM_END(" set phone item", 0); + MF_TA_ACUM_ITEM_END(" tab bar phone item add", 0); + + MF_TA_ACUM_ITEM_BEGIN(" tab bar MMC item add", 0); + if (ap->mf_Status.iStorageState & MYFILE_MMC) { + MF_TA_ACUM_ITEM_BEGIN(" set mmc item", 0); + if(!mf_tab_bar_get_item_by_label(pContent, GET_SYS_STR(MF_LABEL_MMC))) { + pItem = mf_tab_bar_append_item(pContent, MF_ICON_MEMORY, GET_SYS_STR(MF_LABEL_MMC), ap); + mf_language_mgr_register_object_item(pItem, MF_LABEL_MMC, ITEM_TYPE_TAB); + } + MF_TA_ACUM_ITEM_END(" set mmc item", 0); + } + MF_TA_ACUM_ITEM_END(" tab bar MMC item add", 0); +#ifdef MYFILE_USB_OTG + MF_TA_ACUM_ITEM_BEGIN(" tab bar OTG item add", 0); + if (ap->mf_Status.iStorageState & MYFILE_OTG) { + if(!mf_tab_bar_get_item_by_label(pContent, GET_STR(MF_LABEL_OTG))) { + pItem = mf_tab_bar_append_item(pContent, MF_ICON_MEMORY, GET_STR(MF_LABEL_OTG), ap); + mf_language_mgr_register_object_item(pItem, MF_LABEL_OTG, ITEM_TYPE_TAB); + } + } + MF_TA_ACUM_ITEM_END(" tab bar OTG item add", 0); +#endif + MF_TA_ACUM_ITEM_END(" tab bar content set", 0); + + elm_toolbar_select_mode_set(pContent, ELM_OBJECT_SELECT_MODE_ALWAYS); + + MF_TA_ACUM_ITEM_END(" create_tabbar", 0); + } + MF_TRACE_END; +} + diff --git a/src/widget/mf-tray-item.c b/src/widget/mf-tray-item.c new file mode 100644 index 0000000..b7892dd --- /dev/null +++ b/src/widget/mf-tray-item.c @@ -0,0 +1,294 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include + +#include "mf-tray-item.h" +#include "mf-util.h" +#include "mf-widget.h" + +#ifdef MYFILE_TRAY_FEATURE + +#define ICON_NORMAL_SIZE_WIDTH 180.0f +#define ICON_NORMAL_SIZE_HEIGHT 180.0f +#define CATEGORY_IMAGE "Image" +#define CATEGORY_VIDEO "Video" +#define CATEGORY_SOUNDS "Sounds" +#define CATEGORY_DOC "Document" +#define CATEGORY_OTHERS "Others" + +#define LAYOUT_SWALLOW_BG "swallow.bg" +#define LAYOUT_INFO_SHORTCUT_ITEM_ICON "swallow.icon" +static const char *STR_ATTRIBUTE_NAME = "name"; +static const char *STR_ATTRIBUTE_ICON_PRESS = "icon_press"; +static const char *STR_ATTRIBUTE_ICON = "icon"; + +static void __mf_tray_item_del(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + mf_retm_if(obj == NULL, "Invalid argument: parent is NULL\n"); + char *tmp = NULL; + + tmp = evas_object_data_get(obj, STR_ATTRIBUTE_NAME); + SAFE_FREE_CHAR(tmp); + + tmp = evas_object_data_get(obj, STR_ATTRIBUTE_ICON_PRESS); + SAFE_FREE_CHAR(tmp); + + mf_debug("_dock_item_del end.\n"); +} + +int mf_tray_item_type(const char *path) +{ + int type = mf_file_attr_get_file_type_by_mime(path); + int category = mf_tray_item_category_none; + switch(type) { + case FILE_TYPE_IMAGE: + category = mf_tray_item_category_image; + break; + case FILE_TYPE_VIDEO: + category = mf_tray_item_category_video; + break; + case FILE_TYPE_SOUND: + case FILE_TYPE_MUSIC: + category = mf_tray_item_category_sounds; + break; + case FILE_TYPE_DOC: + case FILE_TYPE_PDF: + case FILE_TYPE_PPT: + case FILE_TYPE_EXCEL: + case FILE_TYPE_TXT: + category = mf_tray_item_category_document; + break; + case FILE_TYPE_DIR: + category = mf_tray_item_category_none; + break; + default: + category = mf_tray_item_category_others; + break; + } + mf_debug("path is [%s] category is [%d]", path, category); + return category; +} + +char *mf_tray_item_get_data(Evas_Object *edje, const char *attribute) +{ + return evas_object_data_get(edje, attribute); +} + +static void __item_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + mf_retm_if(NULL == data, "NULL == data"); + mf_retm_if(NULL == obj, "NULL == obj"); + + Evas_Object *icon = NULL; + char *press_icon = NULL; + + icon = elm_object_part_content_get(obj, LAYOUT_INFO_SHORTCUT_ITEM_ICON); + press_icon = mf_tray_item_get_data(obj, STR_ATTRIBUTE_ICON_PRESS); + + if (icon) { + elm_image_file_set(icon, press_icon, NULL); + } + +} + +static void __item_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + mf_retm_if(NULL == data, "NULL == data"); + mf_retm_if(NULL == obj, "NULL == obj"); + + struct appdata *ap = (struct appdata *)data; + Evas_Object *icon = NULL; + char *unpress_icon = NULL; + const char *name = NULL; + + icon = elm_object_part_content_get(obj, LAYOUT_INFO_SHORTCUT_ITEM_ICON); + unpress_icon = mf_tray_item_get_data(obj, STR_ATTRIBUTE_ICON); + name = mf_tray_item_get_data(obj, STR_ATTRIBUTE_NAME); + mf_debug(" %s\t ~~~~~~~~~~~~~~~~name: %s\n",__FUNCTION__, name); + + if (icon) { + elm_image_file_set(icon, unpress_icon, NULL); + } + + int category = mf_tray_item_category_none; //change for test + + + if (g_strcmp0(name, CATEGORY_IMAGE) == 0) { + category = mf_tray_item_category_image; + } else if (g_strcmp0(name, CATEGORY_VIDEO) == 0) { + category = mf_tray_item_category_video; + } else if (g_strcmp0(name, CATEGORY_SOUNDS) == 0) { + category = mf_tray_item_category_sounds; + } else if (g_strcmp0(name, CATEGORY_DOC) == 0) { + category = mf_tray_item_category_document; + } else if (g_strcmp0(name, CATEGORY_OTHERS) == 0) { + category = mf_tray_item_category_others; + } + mf_debug("category is [%d]", category); + if (category != mf_tray_item_category_none) { + ap->mf_Status.view_type = mf_view_root_category; + mf_search_bar_category_search(ap, category); + Evas_Object *btn = mf_widget_unset_part_content(ap->mf_MainWindow.pNaviBar, NAVI_BOTTOM_BUTTON_1_PART); + SAFE_FREE_OBJ(btn); + + btn = mf_widget_util_create_button(ap->mf_MainWindow.pNaviBar, NAVI_BUTTON_STYLE, MF_LABEL_EDIT, NULL, mf_callback_edit_cb, ap); + if (btn) { + elm_object_item_part_content_set(ap->mf_MainWindow.pNaviItem, NAVI_BOTTOM_BUTTON_1_PART, btn); + } + } + +} + +static int __mf_tray_item_register_event(void *data, Evas_Object *obj) +{ + mf_retvm_if(NULL == data, EXIT_FAILURE, "NULL == data"); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, __item_mouse_down_cb, data); + //evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, app_tray); + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, __item_mouse_up_cb, data); + //evas_object_event_callback_add(obj, EVAS_CALLBACK_FOCUS_OUT, _item_focus_out_cb, app_tray); + + return EXIT_SUCCESS; +} +static void __mf_tray_item_data_set(Evas_Object *obj, const char* attribute, const char *data) +{ + mf_retm_if(NULL == obj, "NULL == obj"); + mf_retm_if(NULL == attribute, "NULL == attribute"); + mf_retm_if(NULL == data, "NULL == data"); + + evas_object_data_set(obj, attribute, data); + +} + +static char *__mf_tray_item_get_press_icon(const char *name) +{ + mf_retvm_if(NULL == name, NULL, "NULL == name"); + if (g_strcmp0(name, CATEGORY_IMAGE) == 0) { + return MF_ICON_SHORTCUT_IMAGE_PRESS; + } else if (g_strcmp0(name, CATEGORY_VIDEO) == 0) { + return MF_ICON_SHORTCUT_VIDEO_PRESS; + } else if (g_strcmp0(name, CATEGORY_SOUNDS) == 0) { + return MF_ICON_SHORTCUT_SOUNDS_PRESS; + } else if (g_strcmp0(name, CATEGORY_DOC) == 0) { + return MF_ICON_SHORTCUT_DOCUMENT_PRESS; + } else if (g_strcmp0(name, CATEGORY_OTHERS) == 0) { + return MF_ICON_SHORTCUT_OTHERS_PRESS; + } else { + return NULL; + } +} +Evas_Object *mf_tray_item_create(Evas_Object *parent, const char *icon_file, const char *name) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(icon_file == NULL, NULL, "icon_file is NULL"); + mf_retvm_if(name == NULL, NULL, "name is NULL"); + + Evas_Object *layout = NULL; + Evas_Object *bg; + + layout = mf_widget_create_layout(parent, EDJ_NAME, GRP_TRAY_ITEM); + + #if 0 + bg = evas_object_rectangle_add(evas); + if (!bg) { + evas_object_del(layout); + return NULL; + } + + evas_object_color_set(bg, 0, 0, 0, 0); + evas_object_resize(bg, ICON_NORMAL_SIZE_WIDTH * elm_config_scale_get(), ICON_NORMAL_SIZE_HEIGHT * elm_config_scale_get()); + evas_object_size_hint_min_set(bg, ICON_NORMAL_SIZE_WIDTH * elm_config_scale_get(), ICON_NORMAL_SIZE_HEIGHT * elm_config_scale_get()); + evas_object_size_hint_max_set(bg, ICON_NORMAL_SIZE_WIDTH * elm_config_scale_get(), ICON_NORMAL_SIZE_HEIGHT * elm_config_scale_get()); + #endif + + + Evas_Object *icon = NULL; + + icon = elm_image_add(layout); + if (elm_image_file_set(icon, icon_file, NULL) == EINA_FALSE) { + mf_error("Icon file is not accessible (%s)\n", icon_file); + evas_object_del(icon); + icon = NULL; + } + + elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE); + evas_object_show(icon); + + if (icon) { + Evas_Object *tmp; + tmp = mf_widget_unset_part_content(layout, LAYOUT_INFO_SHORTCUT_ITEM_ICON); + if (tmp) { + evas_object_del(tmp); + } + + elm_object_part_content_set(layout, LAYOUT_INFO_SHORTCUT_ITEM_ICON, icon); + } + + __mf_tray_item_data_set(layout, STR_ATTRIBUTE_NAME, name); + __mf_tray_item_data_set(layout, STR_ATTRIBUTE_ICON, icon_file); + __mf_tray_item_data_set(layout, STR_ATTRIBUTE_ICON_PRESS, __mf_tray_item_get_press_icon(name)); + + //edje_object_part_text_set(_EDJ(layout), LAYOUT_INFO_SHORTCUT_ITEM_NAME, name); + evas_object_show(layout); + //evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, __mf_tray_item_del, NULL); + + return layout; +} +Evas_Object *mf_tray_create(Evas_Object *parent, void *data) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + + + Evas_Object *layout = mf_widget_create_layout(parent, EDJ_NAME, "myfile_shortcut_5_images"); + + + elm_box_horizontal_set(layout, EINA_TRUE); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + Evas_Object *Image = mf_tray_item_create(layout, MF_ICON_SHORTCUT_IMAGE, CATEGORY_IMAGE); + elm_object_part_content_set(layout, "mf_shortcut_image", Image); + __mf_tray_item_register_event(data, Image); + + Evas_Object *Video = mf_tray_item_create(layout, MF_ICON_SHORTCUT_VIDEO, CATEGORY_VIDEO); + elm_object_part_content_set(layout, "mf_shortcut_video", Video); + __mf_tray_item_register_event(data, Video); + + Evas_Object *Sounds = mf_tray_item_create(layout, MF_ICON_SHORTCUT_SOUNDS, CATEGORY_SOUNDS); + elm_object_part_content_set(layout, "mf_shortcut_sound", Sounds); + __mf_tray_item_register_event(data, Sounds); + + Evas_Object *Document = mf_tray_item_create(layout, MF_ICON_SHORTCUT_DOCUMENT, CATEGORY_DOC); + elm_object_part_content_set(layout, "mf_shortcut_document", Document); + __mf_tray_item_register_event(data, Document); + + Evas_Object *Others = mf_tray_item_create(layout, MF_ICON_SHORTCUT_OTHERS, CATEGORY_OTHERS); + elm_object_part_content_set(layout, "mf_shortcut_others", Others); + __mf_tray_item_register_event(data, Others); + + //evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_DOWN, _item_mouse_down_cb, app_tray); + //evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_MOVE, _item_mouse_move_cb, app_tray); + + //evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_UP, _item_mouse_up_cb, app_tray); + //evas_object_event_callback_add(icon, EVAS_CALLBACK_FOCUS_OUT, _item_focus_out_cb, app_tray); + return layout; + +} +#endif diff --git a/src/widget/mf-widget.c b/src/widget/mf-widget.c new file mode 100644 index 0000000..a8f7c27 --- /dev/null +++ b/src/widget/mf-widget.c @@ -0,0 +1,699 @@ +/* + * Copyright 2013 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + +#include "mf-main.h" +#include "mf-callback.h" +#include "mf-search.h" +#include "mf-split-view.h" +#include "mf-widget.h" +#include "mf-fm-svc-wrapper.h" +#include "mf-resource.h" +#include "mf-ta.h" +#include "mf-language-mgr.h" + +extern Elm_Genlist_Item_Class itc; +extern Elm_Genlist_Item_Class userfolderitc; +extern Elm_Genlist_Item_Class categoryitc; +extern Elm_Gengrid_Item_Class gic; + + + +Evas_Object *mf_widget_create_genlist(Evas_Object *parent) +{ + Evas_Object *genlist = NULL; + genlist = elm_genlist_add(parent); + //elm_genlist_homogeneous_set(genlist, EINA_TRUE); + //elm_object_focus_set(genlist, EINA_FALSE); + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + return genlist; +} + +Evas_Object *mf_widget_create_box(Evas_Object * parent) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *box = NULL; + box = elm_box_add(parent); + mf_retvm_if(box == NULL, NULL, "box is NULL"); + elm_object_focus_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_clear(box); + evas_object_show(box); + return box; + +} + +Evas_Object *mf_widget_create_layout(Evas_Object *parent, const char *edj, const char *grp_name) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(edj == NULL, NULL, "edj is NULL"); + mf_retvm_if(grp_name == NULL, NULL, "grp_name is NULL"); + + Evas_Object *layout = NULL; + layout = elm_layout_add(parent); + mf_retvm_if(layout == NULL, NULL, "layout is NULL"); + elm_object_focus_set(layout, EINA_FALSE); + elm_layout_file_set(layout, edj, grp_name); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(layout); + MF_TRACE_END; + return layout; + +} + +Evas_Object *mf_widget_create_conform(Evas_Object * parent) +{ + mf_retv_if(parent == NULL, NULL); + + Evas_Object *conform; + + conform = elm_conformant_add(parent); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + return conform; +} + +Evas_Object *mf_widget_create_check_box(Evas_Object *parent) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *checkbox = NULL; + checkbox = elm_check_add(parent); + elm_object_focus_set(checkbox, EINA_FALSE); + evas_object_propagate_events_set(checkbox, EINA_FALSE); + evas_object_show(checkbox); + return checkbox; +} + +Evas_Object *mf_widget_create_no_content(Evas_Object *parent) +{ + Evas_Object *nocontent = elm_layout_add(parent); + elm_layout_theme_set(nocontent, "layout", "nocontents", "text"); + elm_object_focus_set(nocontent, EINA_FALSE); + elm_object_part_text_set(nocontent, "elm.text", GET_SYS_STR(MF_LABEL_NO_FILES)); + mf_language_mgr_register_object(nocontent, OBJ_TYPE_EDJE_OBJECT, "elm.text", MF_LABEL_NO_FILES); + return nocontent; +} + +Evas_Object *mf_widget_create_select_all_layout(Evas_Object *parent) +{ + + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *pSelectedAllLayout = NULL; + pSelectedAllLayout = elm_layout_add(parent); + elm_object_focus_set(pSelectedAllLayout, EINA_FALSE); + elm_layout_theme_set(pSelectedAllLayout, "genlist", "item", "select_all/default"); + evas_object_size_hint_weight_set(pSelectedAllLayout, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(pSelectedAllLayout, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_text_set(pSelectedAllLayout, "elm.text", GET_SYS_STR(MF_LABEL_SELECT_ALL)); + mf_language_mgr_register_object(pSelectedAllLayout, OBJ_TYPE_EDJE_OBJECT, "elm.text", MF_LABEL_SELECT_ALL); + evas_object_show(pSelectedAllLayout); + return pSelectedAllLayout; +} + +Evas_Object *mf_widget_create_editfield(Evas_Object *parent, Evas_Object **pEntry) +{ + + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + Evas_Object *layout = elm_layout_add(parent); + elm_layout_theme_set(layout, "layout", "editfield", "default"); + Evas_Object *entry = elm_entry_add(parent); + elm_object_style_set(entry, "default"); + elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT); + elm_object_part_content_set(layout, "elm.swallow.content", entry); + *pEntry = entry; + return layout; +} + +Evas_Object *mf_widget_create_search_bar(Evas_Object *parent, Evas_Object **pEntry) +{ + Evas_Object *searchbar_layout = elm_layout_add(parent); + elm_layout_theme_set(searchbar_layout, "layout", "searchbar", "default"); + Evas_Object *entry = elm_entry_add(searchbar_layout); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT); + elm_object_part_content_set(searchbar_layout, "elm.swallow.content", entry); + *pEntry = entry; + return searchbar_layout; +} + +Evas_Object *mf_widget_create_panes(Evas_Object *parent) +{ + MF_TRACE_BEGIN; + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *panes = NULL; + panes = elm_panes_add(parent); + mf_retvm_if(panes == NULL, NULL, "panes is NULL"); + elm_object_focus_set(panes, EINA_FALSE); + evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panes, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_panes_fixed_set(panes, EINA_FALSE); + evas_object_show(panes); + MF_TRACE_END; + return panes; +} + +Evas_Object *mf_widget_create_layout_main(Evas_Object * parent) +{ + Evas_Object *layout; + + mf_retv_if(parent == NULL, NULL); + + layout = elm_layout_add(parent); + mf_retvm_if(layout == NULL, NULL, "Failed elm_layout_add.\n"); + elm_object_focus_set(layout, EINA_FALSE); + + MF_TA_ACUM_ITEM_BEGIN(" elm_layout_theme_set", 0); + elm_layout_theme_set(layout, "layout", "application", "default"); + MF_TA_ACUM_ITEM_END(" elm_layout_theme_set", 0); + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + //elm_win_resize_object_add(parent, layout); + + evas_object_show(layout); + + return layout; +} + + +Evas_Object *mf_widget_create_cancel_button_on_search(Evas_Object *parent) +{ + Evas_Object *cancel_btn = elm_button_add(parent); + elm_object_part_content_set(parent, "button_cancel", cancel_btn); + elm_object_style_set(cancel_btn, "searchbar/default"); + elm_object_text_set(cancel_btn, GET_SYS_STR(LABEL_CANCEL)); + mf_language_mgr_register_object(cancel_btn, OBJ_TYPE_ELM_OBJECT, NULL, LABEL_CANCEL); + return cancel_btn; +} + +void mf_widget_item_remove(Evas_Object *parent, const char *path, int type) +{ + mf_debug("path is [%s]", path); + mf_retm_if(parent == NULL, "parent is NULL"); + mf_retm_if(path == NULL, "path is NULL"); + + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + + if (type == MF_VIEW_STYLE_THUMBNAIL) { + it = elm_gengrid_first_item_get(parent); + } else { + it = elm_genlist_first_item_get(parent); + } + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_ItemName == NULL || itemData->m_ItemName->str == NULL) { + continue; + } + mf_debug("itemData->m_ItemName->str is [%s]", itemData->m_ItemName->str); + if (g_strcmp0(path, itemData->m_ItemName->str) == 0) { + elm_object_item_del(it); + break; + } + + if (type == MF_VIEW_STYLE_THUMBNAIL) { + it = elm_gengrid_item_next_get(it); + } else { + it = elm_genlist_item_next_get(it); + } + } + +} + +void mf_widget_items_remove(Evas_Object *parent, int storage, int type) +{ + mf_retm_if(parent == NULL, "parent is NULL"); + + mfItemData_s *itemData = NULL; + Elm_Object_Item *it = NULL; + Elm_Object_Item *next_it = NULL; + + if (type == MF_VIEW_STYLE_THUMBNAIL) { + it = elm_gengrid_first_item_get(parent); + } else { + it = elm_genlist_first_item_get(parent); + } + while (it) { + itemData = elm_object_item_data_get(it); + if (itemData->m_ItemName == NULL || itemData->m_ItemName->str == NULL) { + continue; + } + if (mf_fm_svc_wrapper_get_location(itemData->m_ItemName->str) == storage){ + if (type == MF_VIEW_STYLE_THUMBNAIL) { + next_it = elm_gengrid_item_next_get(it); + } else { + next_it = elm_genlist_item_next_get(it); + } + elm_object_item_del(it); + it = next_it; + } else { + if (type == MF_VIEW_STYLE_THUMBNAIL) { + it = elm_gengrid_item_next_get(it); + } else { + it = elm_genlist_item_next_get(it); + } + } + } + +} + +Elm_Object_Item *mf_widget_item_append(Evas_Object *parent, fsNodeInfo *pNode, void *data) +{ + mf_retvm_if(parent == NULL, NULL, "pGenlist is NULL"); + mf_retvm_if(pNode == NULL, NULL, "pNode is NULL"); + mf_retvm_if(pNode->path == NULL, NULL, "pNode->path is NULL"); + mf_retvm_if(pNode->name == NULL, NULL, "pNode->name is NULL"); + mf_retvm_if(data == NULL, NULL, "data is NULL"); + + char *real_name = NULL; + mfItemData_s *m_TempItem = NULL; + struct appdata *ap = (struct appdata *)data; + + real_name = g_strconcat(pNode->path, "/", pNode->name, NULL); + if (real_name == NULL) { + return NULL; + } + + mf_genlist_create_data(&m_TempItem, real_name, data); + + if (m_TempItem == NULL) { + free(real_name); + real_name = NULL; + return NULL; + } + + if (ap->mf_Status.view_type == mf_view_root) { + if(g_strcmp0(real_name, PHONE_FOLDER) == 0) { + m_TempItem->thumb_path = strdup(MF_ICON_ITEM_PHONE); + m_TempItem->real_thumb_flag = true; + } else if(g_strcmp0(real_name, MEMORY_FOLDER) == 0) { + m_TempItem->thumb_path = strdup(MF_ICON_ITEM_MMC); + m_TempItem->real_thumb_flag = true; + } else if(g_strcmp0(real_name, OTG_FOLDER) == 0) { + m_TempItem->thumb_path = strdup(MF_ICON_ITEM_MMC); + m_TempItem->real_thumb_flag = true; + } + } + + Elm_Object_Item *it = NULL; + + if (ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + char *tempdate = mf_util_icu_translate(ap, pNode->date); + if (tempdate == NULL) + m_TempItem->create_date = g_strdup("N/A"); + else { + m_TempItem->create_date = g_strdup(tempdate); + free(tempdate); + } + mf_file_attr_get_file_size_info(&(m_TempItem->size), pNode); + } + if (ap->mf_Status.flagViewType == MF_VIEW_STYLE_LIST || ap->mf_Status.flagViewType == MF_VIEW_SYTLE_LIST_DETAIL) { + if (ap->mf_Status.view_type == mf_view_root_category) { + it = elm_genlist_item_append(parent, &categoryitc, m_TempItem, NULL, ELM_GENLIST_ITEM_NONE, mf_genlist_gl_sel, m_TempItem); + } else { + if (mf_file_attr_is_dir(m_TempItem->m_ItemName->str)) { + it = elm_genlist_item_append(parent, &userfolderitc, m_TempItem, NULL, ELM_GENLIST_ITEM_NONE, mf_genlist_gl_sel, m_TempItem); + } else { + it = elm_genlist_item_append(parent, &itc, m_TempItem, NULL, ELM_GENLIST_ITEM_NONE, mf_genlist_gl_sel, m_TempItem); + } + } + } else { + it = elm_gengrid_item_append(parent, &gic, m_TempItem, NULL, NULL); + } + + m_TempItem->item = it; + free(real_name); + return it; +} + +Evas_Object *mf_widget_get_part_content(Evas_Object *parent, const char *part) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(part == NULL, NULL, "part is NULL"); + + Evas_Object *content = NULL; + content = elm_object_part_content_get(parent, part); + return content; +} + +Evas_Object *mf_widget_unset_part_content(Evas_Object *parent, const char *part) +{ + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(part == NULL, NULL, "part is NULL"); + + Evas_Object *content = NULL; + content = elm_object_part_content_unset(parent, part); + return content; +} + +Evas_Object *mf_widget_util_create_button(Evas_Object *parent, char *style, + char *caption, Evas_Object *icon, + void (*func) (void *, Evas_Object *, void *), + void *data) +{ + if (!parent) + return NULL; + + Evas_Object *btn; + + btn = elm_button_add(parent); + + if (style) { + elm_object_style_set(btn, style); + } + + if (caption) { + elm_object_text_set(btn, mf_util_get_text(caption)); + mf_language_mgr_register_object(btn, OBJ_TYPE_ELM_OBJECT, NULL, caption); + } + + if (icon) + elm_object_content_set(btn, icon); + + elm_object_focus_allow_set(btn, EINA_FALSE); + evas_object_propagate_events_set(btn, EINA_FALSE); + + evas_object_smart_callback_add(btn, "clicked", func, (void *)data); + + return btn; +} + +static Eina_Bool __mf_widget_notify_popup_timer_cb(void *data) +{ + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, EINA_FALSE, "ap is null"); + + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, + "sel_contents"); + + SAFE_FREE_OBJ(ap->mf_MainWindow.pLabelLayout); + ap->mf_MainWindow.pPopupTimer = NULL; + return false; +} + +Evas_Object *mf_widget_create_notify_popup(void *data, + Evas_Object *parent, + char *label, + mf_notify_popup_type type, + bool time_out, + void func(void *data, Evas_Object *obj, void *event_info)) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + mf_retvm_if(label == NULL, NULL, "label is NULL"); + + struct appdata *ap = (struct appdata *)data; + mf_retvm_if(ap == NULL, NULL, "ap is NULL"); + + Evas_Object *countlabel = NULL; + if (ap->mf_MainWindow.pLabelLayout && ap->mf_MainWindow.pPopupTimer) { + elm_object_part_text_set(ap->mf_MainWindow.pLabelLayout, "elm.text", label); + countlabel = ap->mf_MainWindow.pLabelLayout; + } else { + mf_widget_unset_part_content(ap->mf_MainWindow.pNaviLayout, + "sel_contents"); + SAFE_FREE_OBJ(ap->mf_MainWindow.pLabelLayout); + countlabel = elm_layout_add(parent); + evas_object_size_hint_weight_set(countlabel, + EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(countlabel, + EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_layout_theme_set(countlabel, "standard", "selectioninfo", "center_text"); + elm_object_part_text_set(countlabel, "elm.text", label); + elm_object_part_content_set(parent, + "sel_contents", + countlabel); + elm_object_signal_emit(countlabel, "show,selection,info", "elm"); + } + + SAFE_DEL_ECORE_TIMER(ap->mf_MainWindow.pPopupTimer); + if (time_out) { + ap->mf_MainWindow.pPopupTimer = ecore_timer_add(3, __mf_widget_notify_popup_timer_cb, ap); + } + + evas_object_show(countlabel); + MF_TRACE_END; + return countlabel; + + +} + +void mf_widget_create_entryfield(void *data, + Evas_Object *parent, + void (*changed_cb)(void *data, Evas_Object *obj, void *event_info), + void (*click_cb)(void *data, Evas_Object *obj, void *event_info)) +{ + struct appdata *ap = (struct appdata *)data; + mf_retm_if(ap == NULL, "ap is NULL"); + Evas_Object *entry = NULL; + + Evas_Object *edit_field = mf_widget_create_editfield(parent, &entry); + + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_scrollable_set(entry, EINA_TRUE); + + elm_object_signal_emit(edit_field, "elm,state,eraser,show", "elm"); + + evas_object_size_hint_weight_set(edit_field, 1, 1); + evas_object_size_hint_align_set(edit_field, 1, 0.5); + //evas_object_show(edit_field); + ap->mf_MainWindow.pEditField = edit_field; + + ap->mf_MainWindow.pEntry = entry; + + evas_object_smart_callback_add(entry, "changed", changed_cb, ap); + elm_object_signal_callback_add(edit_field, "elm,eraser,clicked", "elm", mf_callback_eraser_clicked_cb, entry); + + evas_object_show(entry); +} + +Evas_Object *mf_widget_button_create(Evas_Object *parent, const char *label) +{ + Evas_Object *btn = NULL; + btn = elm_button_add(parent); + if (label) { + elm_object_text_set(btn, label); + mf_language_mgr_register_object(btn, OBJ_TYPE_ELM_OBJECT, NULL, label); + } + return btn; + +} +void mf_widget_panes_right_set(Evas_Object *panes, Evas_Object *content) +{ + mf_retm_if(panes == NULL, "panes is NULL"); + mf_retm_if(content == NULL, "content is NULL"); + elm_object_part_content_set(panes, "right", content); +} + +void mf_widget_panes_left_set(Evas_Object *panes, Evas_Object *content) +{ + mf_retm_if(panes == NULL, "panes is NULL"); + mf_retm_if(content == NULL, "content is NULL"); + elm_object_part_content_set(panes, "left", content); +} + + +#ifdef MYFILE_SPLIT_VIEW +void mf_widget_unset_main_layout_content(Evas_Object *layout) +{ + Evas_Object *unSet = NULL; + unSet = mf_widget_unset_part_content(layout, "elm.swallow.content"); + evas_object_hide(unSet); + +} + +void mf_widget_unset_tabbar_layout_content(Evas_Object *layout) +{ + mf_widget_unset_part_content(layout, "elm.swallow.content"); + mf_widget_unset_part_content(layout, "elm.swallow.tabbar"); + +} +#endif + +void mf_widget_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + if (obj) { + evas_object_size_hint_min_set(obj, w, h); + evas_object_size_hint_max_set(obj, w, h); + } +} + +myfileNaviBar *mf_widget_phone_storage_init(void *data) +{ + MF_TRACE_BEGIN; + mf_retvm_if(data == NULL, NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Evas_Object *parent = ap->mf_MainWindow.pWindow; + + MF_TA_ACUM_ITEM_BEGIN(" mf_navi_bar_create_navi_bar", 0); + ap->mf_MainWindow.pNaviBar = mf_navi_bar_create_navi_bar(parent); + + evas_object_smart_callback_add(ap->mf_MainWindow.pNaviBar, "title,clicked", mf_callback_naviframe_title_clicked_cb, NULL); + + MF_TA_ACUM_ITEM_END(" mf_navi_bar_create_navi_bar", 0); + + if (ap->mf_MainWindow.pNaviBar == NULL) { + return NULL; + } + MF_TA_ACUM_ITEM_BEGIN(" make phone navi struct", 0); + myfileNaviBar *pNavi_phone = malloc(sizeof(myfileNaviBar)); + mf_retvm_if(pNavi_phone == NULL, NULL, "pNavi_phone is NULL"); + memset(pNavi_phone, 0, sizeof(myfileNaviBar)); + pNavi_phone->naviFlagInUse = TRUE; + pNavi_phone->pCurrentPath = g_strdup(ap->mf_Status.path->str); + pNavi_phone->pre_more = MORE_DEFAULT; + pNavi_phone->pNaviLabel = strdup(GET_SYS_STR(MF_LABEL_PHONE)); + /*insert phone navi into the navi_list */ + /** Todo: if we need to check ap->mf_MainWindow.plistNaviBar?*/ + ap->mf_MainWindow.plistNaviBar = eina_list_append(ap->mf_MainWindow.plistNaviBar, pNavi_phone); + MF_TA_ACUM_ITEM_END(" make phone navi struct", 0); + MF_TRACE_END; + return pNavi_phone; +} + + +void mf_widget_create(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + +#ifdef MYFILE_SPLIT_VIEW + struct appdata *ap = (struct appdata*)data; + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + if (ap->mf_MainWindow.sSplitData.bFlagSplitViewCreate == FALSE) { + mf_split_view_init(ap); + } + } +#endif + MF_TRACE_END; + +} + + +#ifdef MYFILE_SPLIT_VIEW +void mf_widget_set_main_layout_content(void *data) +{ + + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + if (ap->mf_Status.more == MORE_SEARCH || ap->mf_Status.more == MORE_CREATE_FOLDER || (ap->mf_Status.more == MORE_RENAME && ap->mf_Status.preMore == MORE_SEARCH)) { + return; + } + + if (ap->mf_Status.view_type == mf_view_root_category || ap->mf_Status.view_type == mf_view_root) { + return; + } + + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + + mf_widget_unset_main_layout_content(ap->mf_MainWindow.pMainLayout); + elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); + mf_widget_panes_right_set(ap->mf_MainWindow.sSplitData.pPanes, ap->mf_MainWindow.sSplitData.pMainLayout); + mf_split_view_show(ap); + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.sSplitData.pPanes); + + } else { + mf_split_view_unset_right_content(ap); + mf_widget_unset_main_layout_content(ap->mf_MainWindow.pMainLayout); + mf_split_view_hide(ap); + evas_object_show(ap->mf_MainWindow.pMainLayout); + elm_object_part_content_set(ap->mf_MainWindow.pMainLayout, "elm.swallow.content", ap->mf_MainWindow.pNaviBar); + } + + MF_TRACE_END; + +} +#endif +void mf_widget_refresh_view(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + + if (ap->mf_Status.more == MORE_DEFAULT) { + mf_navi_bar_create_default_view(ap); + } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE + || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) { + mf_navi_bar_create_path_select_view(ap); + } else if (ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT) { + mf_callback_edit_cb(ap, NULL, NULL); + } + +#ifdef MYFILE_SPLIT_VIEW + if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) { + mf_split_view_refresh(ap); + } +#endif + mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar); + MF_TRACE_END; +} + +void mf_widget_set_navi_blocking(void * data,Eina_Bool is_locked) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + + struct appdata *ap = (struct appdata*)data; + ap->mf_Status.flagNaviPush = is_locked; +} + + +#ifdef MYFILE_MOTION_FEATURE +void mf_widget_first_item_bring_in(void *data) +{ + MF_TRACE_BEGIN; + mf_retm_if(data == NULL, "data is NULL"); + struct appdata *ap = (struct appdata*)data; + + Evas_Object *genlist = NULL; + genlist = ap->mf_MainWindow.pNaviGenlist; + if (ap->mf_Status.doubletab_event_handler) { + ap->mf_Status.doubletab_event_handler(genlist); + } +} +#endif +void mf_widget_imf_hide_callback_register(Evas_Object *pConformant, void *data) +{ + evas_object_smart_callback_add(pConformant, "virtualkeypad,state,off", + mf_callback_imf_hide_cb, data); +} + +void mf_widget_imf_hide_callback_del(Evas_Object *pConformant) +{ + evas_object_smart_callback_del(pConformant, "virtualkeypad,state,off", + mf_callback_imf_hide_cb); +} + + -- 2.7.4