2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <sys/types.h>
23 #include <media_content.h>
24 #include <drm_client.h>
25 #include <drm_client_types.h>
26 #include "mf-ug-fs-util.h"
27 #include "mf-ug-util.h"
29 #define MF_UG_PHONE_DEFAULT_LEVEL 2 /*the phone path is /opt/media, it consists of opt and media two parts*/
30 #define MF_UG_MMC_DEFAULT_LEVEL 3 /*the mmc path is /opt/storage/sdcard, it consists of opt and storage and sdcard three parts*/
31 #define CONDITION_LENGTH 200
32 #define UG_CONDITION_IMAGE_VIDEO "(MEDIA_TYPE=0 OR MEDIA_TYPE=1)"
34 typedef struct __ug_filter_s ug_filter_s;
35 struct __ug_filter_s {
36 char *cond; /*set media type or favorite type, or other query statement*/
37 media_content_collation_e collate_type; /*collate type*/
38 media_content_order_e sort_type; /*sort type*/
39 char *sort_keyword; /*sort keyword*/
40 int offset; /*offset*/
42 bool with_meta; /*whether get image or video info*/
45 typedef struct __ug_transfer_data_s ug_transfer_data_s;
47 struct __ug_transfer_data_s {
48 const char *file_path;
53 struct _ug_ftype_by_mime {
55 mf_ug_fs_file_type ftype;
58 static struct _ug_ftype_by_mime mime_type[] = {
59 {"image/png", UG_FILE_TYPE_IMAGE},
60 {"image/jpeg", UG_FILE_TYPE_IMAGE},
61 {"image/gif", UG_FILE_TYPE_IMAGE},
62 {"image/bmp", UG_FILE_TYPE_IMAGE},
63 {"image/vnd.wap.wbmp", UG_FILE_TYPE_IMAGE},
65 {"video/x-msvideo", UG_FILE_TYPE_VIDEO},
66 {"video/mp4", UG_FILE_TYPE_VIDEO},
67 {"video/3gpp", UG_FILE_TYPE_VIDEO},
68 {"video/x-ms-asf", UG_FILE_TYPE_VIDEO},
69 {"video/x-ms-wmv", UG_FILE_TYPE_VIDEO},
70 {"video/x-matroska", UG_FILE_TYPE_VIDEO},
72 {"audio/mpeg", UG_FILE_TYPE_MUSIC},
73 {"audio/x-wav", UG_FILE_TYPE_MUSIC},
74 {"application/x-smaf", UG_FILE_TYPE_MUSIC},
75 {"audio/mxmf", UG_FILE_TYPE_MUSIC},
76 {"audio/midi", UG_FILE_TYPE_MUSIC},
77 {"audio/x-xmf", UG_FILE_TYPE_MUSIC},
78 {"audio/x-ms-wma", UG_FILE_TYPE_MUSIC},
79 {"audio/aac", UG_FILE_TYPE_MUSIC},
80 {"audio/ac3", UG_FILE_TYPE_MUSIC},
81 {"audio/ogg", UG_FILE_TYPE_MUSIC},
82 {"audio/vorbis", UG_FILE_TYPE_MUSIC},
83 {"audio/imelody", UG_FILE_TYPE_MUSIC},
84 {"audio/iMelody", UG_FILE_TYPE_MUSIC},
85 {"audio/x-rmf", UG_FILE_TYPE_MUSIC},
86 {"application/vnd.smaf", UG_FILE_TYPE_MUSIC},
87 {"audio/mobile-xmf", UG_FILE_TYPE_MUSIC},
88 {"audio/mid", UG_FILE_TYPE_MUSIC},
89 {"audio/vnd.ms-playready.media.pya", UG_FILE_TYPE_MUSIC},
90 {"audio/imy", UG_FILE_TYPE_MUSIC},
91 {"audio/m4a", UG_FILE_TYPE_MUSIC},
92 {"audio/melody", UG_FILE_TYPE_MUSIC},
93 {"audio/mmf", UG_FILE_TYPE_MUSIC},
94 {"audio/mp3", UG_FILE_TYPE_MUSIC},
95 {"audio/mp4", UG_FILE_TYPE_MUSIC},
96 {"audio/MP4A-LATM", UG_FILE_TYPE_MUSIC},
97 {"audio/mpeg3", UG_FILE_TYPE_MUSIC},
98 {"audio/mpeg4", UG_FILE_TYPE_MUSIC},
99 {"audio/mpg", UG_FILE_TYPE_MUSIC},
100 {"audio/mpg3", UG_FILE_TYPE_MUSIC},
101 {"audio/smaf", UG_FILE_TYPE_MUSIC},
102 {"audio/sp-midi", UG_FILE_TYPE_MUSIC},
103 {"audio/wav", UG_FILE_TYPE_MUSIC},
104 {"audio/wave", UG_FILE_TYPE_MUSIC},
105 {"audio/wma", UG_FILE_TYPE_MUSIC},
106 {"audio/xmf", UG_FILE_TYPE_MUSIC},
107 {"audio/x-mid", UG_FILE_TYPE_MUSIC},
108 {"audio/x-midi", UG_FILE_TYPE_MUSIC},
109 {"audio/x-mp3", UG_FILE_TYPE_MUSIC},
110 {"audio/-mpeg", UG_FILE_TYPE_MUSIC},
111 {"audio/x-mpeg", UG_FILE_TYPE_MUSIC},
112 {"audio/x-mpegaudio", UG_FILE_TYPE_MUSIC},
113 {"audio/x-mpg", UG_FILE_TYPE_MUSIC},
114 {"audio/x-ms-asf", UG_FILE_TYPE_MUSIC},
115 {"audio/x-wave", UG_FILE_TYPE_MUSIC},
117 {"application/pdf", UG_FILE_TYPE_PDF},
119 {"application/msword", UG_FILE_TYPE_DOC},
120 {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", UG_FILE_TYPE_DOC},
122 {"application/vnd.ms-powerpoint", UG_FILE_TYPE_PPT},
123 {"application/vnd.openxmlformats-officedocument.presentationml.presentation", UG_FILE_TYPE_PPT},
125 {"application/vnd.ms-excel", UG_FILE_TYPE_EXCEL},
126 {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", UG_FILE_TYPE_EXCEL},
128 {"audio/AMR", UG_FILE_TYPE_VOICE},
129 {"audio/AMR-WB", UG_FILE_TYPE_VOICE},
130 {"audio/amr", UG_FILE_TYPE_VOICE},
131 {"audio/amr-wb", UG_FILE_TYPE_VOICE},
132 {"audio/x-amr", UG_FILE_TYPE_VOICE},
134 {"text/html", UG_FILE_TYPE_HTML},
136 {"application/x-shockwave-flash", UG_FILE_TYPE_FLASH},
137 {"video/x-flv", UG_FILE_TYPE_FLASH},
139 {"text/plain", UG_FILE_TYPE_TXT},
141 {"text/x-opml+xml", UG_FILE_TYPE_RSS},
143 {"text/vnd.sun.j2me.app-descriptor", UG_FILE_TYPE_JAVA},
144 {"application/x-java-archive", UG_FILE_TYPE_JAVA},
146 {NULL, UG_FILE_TYPE_ETC},
149 static char *icon_array[UG_FILE_TYPE_MAX] = {
150 [UG_FILE_TYPE_DIR] = UG_ICON_FOLDER,
151 [UG_FILE_TYPE_IMAGE] = UG_ICON_IMAGE,
152 [UG_FILE_TYPE_VIDEO] = UG_ICON_VIDEO,
153 [UG_FILE_TYPE_MUSIC] = UG_ICON_MUSIC,
154 [UG_FILE_TYPE_SOUND] = UG_ICON_SOUND,
155 [UG_FILE_TYPE_PDF] = UG_ICON_PDF,
156 [UG_FILE_TYPE_DOC] = UG_ICON_DOC,
157 [UG_FILE_TYPE_PPT] = UG_ICON_PPT,
158 [UG_FILE_TYPE_EXCEL] = UG_ICON_EXCEL,
159 [UG_FILE_TYPE_VOICE] = UG_ICON_VOICE,
160 [UG_FILE_TYPE_HTML] = UG_ICON_HTML,
161 [UG_FILE_TYPE_FLASH] = UG_ICON_FLASH,
162 [UG_FILE_TYPE_TXT] = UG_ICON_TXT,
163 [UG_FILE_TYPE_VCONTACT] = UG_ICON_VCONTACT,
164 [UG_FILE_TYPE_VCALENDAR] = UG_ICON_VCALENDAR,
165 [UG_FILE_TYPE_VNOTE] = UG_ICON_VNOTE,
166 [UG_FILE_TYPE_RSS] = UG_ICON_RSS,
167 [UG_FILE_TYPE_JAVA] = UG_ICON_JAVA,
170 /*********************
171 **Function name: __mf_ug_file_attr_get_category_by_file_ext
172 **Parameter: const char* file_ext
173 **Return value: mf_ug_fs_file_type
176 ** Get file category by extention
178 *********************/
179 static mf_ug_fs_file_type __mf_ug_file_attr_get_category_by_file_ext(const char *file_ext, const char *fullpath)
183 if (file_ext == NULL) {
184 return UG_FILE_TYPE_ETC;
187 if (file_ext[0] == '.') {
191 switch (file_ext[i]) {
194 if (strcasecmp("ASF", &file_ext[i]) == 0) {
195 return UG_FILE_TYPE_VIDEO;
197 if (strcasecmp("AMR", &file_ext[i]) == 0) {
198 return UG_FILE_TYPE_VOICE;
200 if (strcasecmp("AWB", &file_ext[i]) == 0) {
201 return UG_FILE_TYPE_VOICE;
203 if (strcasecmp("AAC", &file_ext[i]) == 0) {
204 return UG_FILE_TYPE_MUSIC;
206 if (strcasecmp("AVI", &file_ext[i]) == 0) {
207 return UG_FILE_TYPE_VIDEO;
209 if (strcasecmp("AAC", &file_ext[i]) == 0) {
210 return UG_FILE_TYPE_MUSIC;
216 if (strcasecmp("BMP", &file_ext[i]) == 0) {
217 return UG_FILE_TYPE_IMAGE;
222 if (strcasecmp("DOC", &file_ext[i]) == 0) {
223 return UG_FILE_TYPE_DOC;
225 if (strcasecmp("DOCX", &file_ext[i]) == 0) {
226 return UG_FILE_TYPE_DOC;
228 if (strcasecmp("DIVX", &file_ext[i]) == 0) {
229 if (mf_ug_file_attr_is_drm_file(fullpath) == 0) {
230 return UG_FILE_TYPE_DRM;
232 return UG_FILE_TYPE_VIDEO;
235 if (strcasecmp("DCF", &file_ext[i]) == 0) {
236 return UG_FILE_TYPE_DRM;
241 if (strcasecmp("GIF", &file_ext[i]) == 0) {
242 return UG_FILE_TYPE_IMAGE;
244 if (strcasecmp("G72", &file_ext[i]) == 0) {
245 return UG_FILE_TYPE_MUSIC;
250 if (strcasecmp("H263", &file_ext[i]) == 0) {
251 return UG_FILE_TYPE_MUSIC;
253 if (strcasecmp("HTML", &file_ext[i]) == 0) {
254 return UG_FILE_TYPE_HTML;
256 if (strcasecmp("HTM", &file_ext[i]) == 0) {
257 return UG_FILE_TYPE_HTML;
262 if (strcasecmp("IMY", &file_ext[i]) == 0) {
263 return UG_FILE_TYPE_SOUND;
265 if (strcasecmp("IPK", &file_ext[i]) == 0) {
266 return UG_FILE_TYPE_APP;
271 if (strcasecmp("JAD", &file_ext[i]) == 0) {
272 return UG_FILE_TYPE_JAVA;
274 if (strcasecmp("JAR", &file_ext[i]) == 0) {
275 return UG_FILE_TYPE_JAVA;
278 if (strcasecmp("JPG", &file_ext[i]) == 0) {
279 return UG_FILE_TYPE_IMAGE;
281 if (strcasecmp("JPEG", &file_ext[i]) == 0) {
282 return UG_FILE_TYPE_IMAGE;
284 if (strcasecmp("JPE", &file_ext[i]) == 0) {
285 return UG_FILE_TYPE_IMAGE;
290 if (strcasecmp("MMF", &file_ext[i]) == 0) {
291 return UG_FILE_TYPE_SOUND;
293 if (strcasecmp("MP3", &file_ext[i]) == 0) {
294 return UG_FILE_TYPE_MUSIC;
296 if (strcasecmp("MID", &file_ext[i]) == 0) {
297 return UG_FILE_TYPE_SOUND;
299 if (strcasecmp("MIDI", &file_ext[i]) == 0) {
300 return UG_FILE_TYPE_SOUND;
302 if (strcasecmp("MP4", &file_ext[i]) == 0) {
303 return UG_FILE_TYPE_VIDEO;
305 if (strcasecmp("MPG", &file_ext[i]) == 0) {
306 return UG_FILE_TYPE_VIDEO;
308 if (strcasecmp("MPEG", &file_ext[i]) == 0) {
309 return UG_FILE_TYPE_VIDEO;
311 if (strcasecmp("M4A", &file_ext[i]) == 0) {
312 return UG_FILE_TYPE_MUSIC;
314 if (strcasecmp("M3G", &file_ext[i]) == 0) {
315 return UG_FILE_TYPE_FLASH;
317 if (strcasecmp("MXMF", &file_ext[i]) == 0) {
318 return UG_FILE_TYPE_SOUND;
320 if (strcasecmp("MKV", &file_ext[i]) == 0) {
321 return UG_FILE_TYPE_VIDEO;
323 if (strcasecmp("MKA", &file_ext[i]) == 0) {
324 return UG_FILE_TYPE_MUSIC;
329 if (strcasecmp("opml", &file_ext[i]) == 0) {
330 return UG_FILE_TYPE_RSS;
335 if (strcasecmp("PNG", &file_ext[i]) == 0) {
336 return UG_FILE_TYPE_IMAGE;
338 if (strcasecmp("PJPEG", &file_ext[i]) == 0) {
339 return UG_FILE_TYPE_IMAGE;
341 if (strcasecmp("PDF", &file_ext[i]) == 0) {
342 return UG_FILE_TYPE_PDF;
344 if (strcasecmp("PPT", &file_ext[i]) == 0) {
345 return UG_FILE_TYPE_PPT;
347 if (strcasecmp("PPTX", &file_ext[i]) == 0) {
348 return UG_FILE_TYPE_PPT;
350 if (strcasecmp("PEM", &file_ext[i]) == 0) {
351 return UG_FILE_TYPE_CERTIFICATION;
359 if (strcasecmp("SDP", &file_ext[i]) == 0) {
360 return UG_FILE_TYPE_VIDEO;
362 if (strcasecmp("SPM", &file_ext[i]) == 0) {
363 return UG_FILE_TYPE_SOUND;
365 if (strcasecmp("SMP", &file_ext[i]) == 0) {
366 return UG_FILE_TYPE_SOUND;
368 if (strcasecmp("SPF", &file_ext[i]) == 0) {
369 return UG_FILE_TYPE_SOUND;
371 if (strcasecmp("SWF", &file_ext[i]) == 0) {
372 return UG_FILE_TYPE_FLASH;
374 if (strcasecmp("SCN", &file_ext[i]) == 0) {
375 return UG_FILE_TYPE_MOVIE_MAKER;
377 if (strcasecmp("SVG", &file_ext[i]) == 0) {
378 return UG_FILE_TYPE_SVG;
380 if (strcasecmp("SVGZ", &file_ext[i]) == 0) {
381 return UG_FILE_TYPE_SVG;
386 if (strcasecmp("TXT", &file_ext[i]) == 0) {
387 return UG_FILE_TYPE_TXT;
389 if (strcasecmp("THM", &file_ext[i]) == 0) {
390 return UG_FILE_TYPE_THEME;
395 if (strcasecmp("VCF", &file_ext[i]) == 0) {
396 return UG_FILE_TYPE_VCONTACT;
398 if (strcasecmp("VCS", &file_ext[i]) == 0) {
399 return UG_FILE_TYPE_VCALENDAR;
401 if (strcasecmp("VNT", &file_ext[i]) == 0) {
402 return UG_FILE_TYPE_VNOTE;
404 if (strcasecmp("VBM", &file_ext[i]) == 0) {
405 return UG_FILE_TYPE_VBOOKMARK;
410 if (strcasecmp("WAV", &file_ext[i]) == 0) {
411 return UG_FILE_TYPE_SOUND;
413 if (strcasecmp("WBMP", &file_ext[i]) == 0) {
414 return UG_FILE_TYPE_IMAGE;
416 if (strcasecmp("WGT", &file_ext[i]) == 0) {
417 return UG_FILE_TYPE_WGT;
419 if (strcasecmp("WMA", &file_ext[i]) == 0) {
420 return UG_FILE_TYPE_MUSIC;
422 if (strcasecmp("WMV", &file_ext[i]) == 0) {
423 return UG_FILE_TYPE_VIDEO;
428 if (strcasecmp("XLS", &file_ext[i]) == 0) {
429 return UG_FILE_TYPE_EXCEL;
431 if (strcasecmp("XLSX", &file_ext[i]) == 0) {
432 return UG_FILE_TYPE_EXCEL;
434 if (strcasecmp("XMF", &file_ext[i]) == 0) {
435 return UG_FILE_TYPE_SOUND;
437 if (strcasecmp("XHTML", &file_ext[i]) == 0) {
438 return UG_FILE_TYPE_HTML;
442 if (strcasecmp("3GP", &file_ext[i]) == 0) {
443 return UG_FILE_TYPE_VIDEO;
445 if (strcasecmp("3GPP", &file_ext[i]) == 0) {
446 return UG_FILE_TYPE_VIDEO;
448 if (strcasecmp("3G2", &file_ext[i]) == 0) {
449 return UG_FILE_TYPE_VIDEO;
454 return UG_FILE_TYPE_ETC;
457 /*********************
458 **Function name: mf_ug_file_attr_is_valid_name
460 ** const char *filename: the file/dir name we need to check
463 ** -0x14 if the name is invalid
464 ** 0 if the name is valid
467 ** check if the name is valid by file name
469 *********************/
470 int mf_ug_file_attr_is_valid_name(const char *filename)
473 int ret, z, cflags = 0;
477 const size_t nmatch = 1;
478 /*/ToDo: ignore the file star with . */
479 if (strncmp(filename, ".", 1) == 0) {
480 return MYFILE_ERR_INVALID_FILE_NAME;
483 pattern = MYFILE_NAME_PATTERN;
484 z = regcomp(®, pattern, cflags);
487 regerror(z, ®, ebuf, sizeof(ebuf));
488 fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
489 return MYFILE_ERR_INVALID_FILE_NAME;
492 z = regexec(®, filename, nmatch, pm, 0);
493 if (z == REG_NOMATCH) {
494 ret = MYFILE_ERR_NONE;
496 ret = MYFILE_ERR_INVALID_FILE_NAME;
503 /******************************
504 ** Prototype : __mf_ug_file_attr_default_icon_get_by_type
505 ** Description : Samsung
506 ** Input : mf_ug_fs_file_type ftype
513 ** 1.Date : 2010/12/10
515 ** Modification : Created function
517 ******************************/
518 static char *__mf_ug_file_attr_default_icon_get_by_type(mf_ug_fs_file_type ftype)
520 char *icon_path = NULL;
522 if (icon_array[ftype]) {
523 icon_path = strdup(icon_array[ftype]);
525 icon_path = strdup(UG_DEFAULT_ICON);
532 /******************************
533 ** Prototype : mf_ug_file_attr_get_parent_path
534 ** Description : Samsung
535 ** Input : const char* path
543 ** 1.Date : 2010/12/10
545 ** Modification : Created function
547 ******************************/
548 int mf_ug_file_attr_get_parent_path(const char *path, char **parent_path)
550 ug_mf_retvm_if(path == NULL, MYFILE_ERR_INVALID_ARG, "path is NULL");
551 ug_mf_retvm_if(parent_path == NULL, MYFILE_ERR_INVALID_ARG, "parent_path is NULL");
552 ug_debug("Path :::: [%s]", path);
554 *parent_path = g_strdup(path);
555 if (*parent_path == NULL)
556 return MYFILE_ERR_ALLOCATE_FAIL;
558 const char *name = NULL;
559 name = ecore_file_file_get(path);
561 ** input path and parent_path are check in the caller.
562 ** parent_path is full path must be like /opt/media/file.ext
564 ** strlen(parent_path) should large than strlen(name) normally.
565 ** to take exception like input path is "", we add a if condition
567 if (strlen(*parent_path) > strlen(name))
568 (*parent_path)[strlen(*parent_path) - strlen(name) - 1] = '\0';
570 if (strlen(*parent_path) == 0) {
571 *parent_path = g_strdup("/");
574 return MYFILE_ERR_NONE;
578 /*********************
579 **Function name: mf_get_category
581 ** const char* filepath: file fullpath
582 ** mf_ug_fs_file_type *category: output parameter of category
587 ** Get file category by file full path
589 *********************/
590 int mf_ug_file_attr_get_file_category(const char *filepath, mf_ug_fs_file_type * category)
595 if (mf_ug_file_attr_is_dir(filepath)) {
596 *category = UG_FILE_TYPE_DIR;
597 return MYFILE_ERR_NONE;
600 const char *filename = NULL;
601 filename = ecore_file_file_get(filepath);
602 /*/return value ceck */
603 if (filename == NULL) {
604 *category = UG_FILE_TYPE_NONE;
605 return MYFILE_ERR_SRC_ARG_INVALID;
607 char file_ext[FILE_EXT_LEN_MAX + 1] = { 0 };
608 /*/ToDo: error file name like the last letter is "." */
609 for (i = strlen(filename); i >= 0; i--) {
610 if (filename[i] == '.') {
611 strncpy(file_ext, &filename[i + 1], FILE_EXT_LEN_MAX + 1);
616 if (filename[i] == '/') {
623 *category = __mf_ug_file_attr_get_category_by_file_ext(file_ext, filepath);
624 return MYFILE_ERR_NONE;
626 *category = UG_FILE_TYPE_NONE;
627 return MYFILE_ERR_GET_CATEGORY_FAIL;
631 /*********************
632 **Function name: mf_ug_file_attr_get_file_stat
634 ** const char* filename: file name
635 ** ugFsNodeInfo **node: output parameter of what we need to refine
640 ** Get file size and last modified date by file path
642 *********************/
643 int mf_ug_file_attr_get_file_stat(const char *filename, ugFsNodeInfo ** node)
647 ug_mf_retvm_if(filename == NULL, MYFILE_ERR_INVALID_ARG, "filename is null");
648 ug_mf_retvm_if(node == NULL, MYFILE_ERR_INVALID_ARG, "node is null");
650 if (stat(filename, &statbuf) == -1) {
651 return MYFILE_ERR_GET_STAT_FAIL;
654 (*node)->size = statbuf.st_size;
655 (*node)->date = statbuf.st_mtime;
657 return MYFILE_ERR_NONE;
660 /*********************
661 **Function name: mf_ug_file_attr_is_dir
663 ** const char* filename: file fullpath
665 ** if path is a directory, return 1
669 ** check if the file path is Directory
671 *********************/
672 int mf_ug_file_attr_is_dir(const char *filepath)
674 return ecore_file_is_dir(filepath);
677 /*********************
678 **Function name: mf_ug_file_attr_get_store_type_by_full
680 ** const char* filepath: file full path
681 ** mf_ug_storage_type *store_type: output parameter of storage type
686 ** Get file storage type by file path
688 *********************/
689 int mf_ug_file_attr_get_store_type_by_full(const char *filepath, mf_ug_storage_type * store_type)
691 if (filepath == NULL || store_type == NULL) {
692 return MYFILE_ERR_SRC_ARG_INVALID;
695 if (strncmp(filepath, PHONE_FOLDER, strlen(PHONE_FOLDER)) == 0) {
696 *store_type = MF_UG_PHONE;
697 return MYFILE_ERR_NONE;
698 } else if (strncmp(filepath, MEMORY_FOLDER, strlen(MEMORY_FOLDER)) == 0) {
699 *store_type = MF_UG_MMC;
700 return MYFILE_ERR_NONE;
702 *store_type = MF_UG_NONE;
703 return MYFILE_ERR_STORAGE_TYPE_ERROR;
707 /*********************
708 **Function name: mf_ug_file_attr_is_drm_file
710 ** const char* filepath: file full path
713 ** true if it is a DRM file
714 ** false if it is not a DRM file
717 ** check if file is drm file
719 *********************/
720 int mf_ug_file_attr_is_drm_file(const char *file_fullpath)
722 if (file_fullpath == NULL)
723 return MYFILE_ERR_DRM_PERMISSION_DENY;
724 drm_bool_type_e drmFlag = DRM_FALSE;
726 res = drm_is_drm_file(file_fullpath, &drmFlag);
728 if (res == DRM_RETURN_SUCCESS && drmFlag == DRM_TRUE)
731 return MYFILE_ERR_DRM_PERMISSION_DENY;
734 /*********************
735 **Function name: mf_ug_file_attr_get_file_ext
737 ** const char* filepath: file full path
738 ** char *file_ext: output parameter of file extension
744 ** get file extension by file full path
746 *********************/
747 int mf_ug_file_attr_get_file_ext(const char *filepath, char **file_ext)
749 ug_mf_retvm_if(filepath == NULL, MYFILE_ERR_INVALID_FILE_NAME, "filepath is NULL");
750 ug_mf_retvm_if(file_ext == NULL, MYFILE_ERR_INVALID_FILE_NAME, "file_ext is NULL");
752 const char *filename = NULL;
753 filename = ecore_file_file_get(filepath);
755 if (filename == NULL) {
756 return MYFILE_ERR_INVALID_FILE_NAME;
759 char *pdot = strrchr(filename, '.');
762 return MYFILE_ERR_EXT_GET_ERROR;
763 } else if (pdot != filepath) {
764 *file_ext = g_strdup(pdot + 1);
765 return MYFILE_ERR_NONE;
767 return MYFILE_ERR_EXT_GET_ERROR;
773 /*********************
774 **Function name: mf_ug_file_attr_is_right_dir_path
776 ** const char *filename: the file/dir name we need to check
782 ** check if the dir path is correct
784 *********************/
785 int mf_ug_file_attr_is_right_dir_path(const char *dir_path)
787 int result = MYFILE_ERR_NONE;
790 length = strlen(dir_path);
792 return MYFILE_ERR_INVALID_DIR_PATH;
795 if (dir_path[length - 1] == '/' && length > 1) {
796 return MYFILE_ERR_INVALID_DIR_PATH;
799 if (dir_path[0] != '/') {
800 return MYFILE_ERR_INVALID_DIR_PATH;
803 const char *file_name = NULL;
804 file_name = ecore_file_file_get(dir_path);
805 result = mf_ug_file_attr_is_valid_name(file_name);
807 if (result != MYFILE_ERR_NONE) {
808 ug_mf_error("Is NOT Valid dir path name");
814 /*********************
815 **Function name: mf_ug_file_attr_is_right_file_path
817 ** const char *filename: the file/dir name we need to check
823 ** check if the file path is correct
825 *********************/
826 int mf_ug_file_attr_is_right_file_path(const char *file_path)
828 int result = MYFILE_ERR_NONE;
830 if (strlen(file_path) == 0) {
831 return MYFILE_ERR_INVALID_FILE_PATH;
834 if (file_path[0] != '/') {
835 return MYFILE_ERR_INVALID_DIR_PATH;
838 const char *file_name = NULL;
839 file_name = ecore_file_file_get(file_path);
840 result = mf_ug_file_attr_is_valid_name(file_name);
841 if (result != MYFILE_ERR_NONE) {
842 ug_mf_error("Is NOT Valid dir path name");
849 static int __mf_ug_create_filter(filter_h *filter, ug_filter_s *condition)
851 ug_mf_retvm_if(filter == NULL, -1, "filter is NULL");
852 ug_mf_retvm_if(condition == NULL, -1, "condition is NULL");
854 int ret = MEDIA_CONTENT_ERROR_NONE;
855 filter_h tmp_filter = NULL;
856 ret = media_filter_create(&tmp_filter);
857 if(ret != MEDIA_CONTENT_ERROR_NONE) {
858 ug_debug("Fail to create filter");
861 if (condition->cond) {
862 ret = media_filter_set_condition(tmp_filter, condition->cond,
863 condition->collate_type);
864 if(ret != MEDIA_CONTENT_ERROR_NONE) {
865 ug_debug("Fail to set condition");
870 if (condition->sort_keyword) {
871 ret = media_filter_set_order(tmp_filter, condition->sort_type,
872 condition->sort_keyword,
873 condition->collate_type);
874 if(ret != MEDIA_CONTENT_ERROR_NONE) {
875 ug_debug("Fail to set order");
880 ug_debug("offset is %d, count is %d", condition->offset, condition->count);
881 if (condition->offset != -1 && condition->count != -1 &&
882 condition->count > condition->offset) {
883 ret = media_filter_set_offset(tmp_filter, condition->offset,
885 if(ret != MEDIA_CONTENT_ERROR_NONE) {
886 ug_debug("Fail to set offset");
890 *filter = tmp_filter;
894 media_filter_destroy(tmp_filter);
900 static int __mf_ug_destroy_filter(filter_h filter)
902 ug_mf_retvm_if(filter == NULL, -1, "filter is NULL");
903 int ret = MEDIA_CONTENT_ERROR_NONE;
904 ret = media_filter_destroy(filter);
909 static bool __mf_ug_local_data_get_media_thumbnail_cb(media_info_h media, void *data)
911 ug_mf_retvm_if(data == NULL, -1, "filter is NULL");
912 ug_transfer_data_s *tmp_data = (ug_transfer_data_s *)data;
914 media_info_get_thumbnail_path(media, &(tmp_data->thumbnail_path));
921 int static __mf_ug_local_thumbnail_get(void *data, ug_filter_s *condition)
925 filter_h filter = NULL;
926 ret = __mf_ug_create_filter(&filter, condition);
928 ug_debug("Create filter failed");
933 ret = media_info_foreach_media_from_db(filter,
934 __mf_ug_local_data_get_media_thumbnail_cb,
937 ug_debug("media_info_foreach_media_from_db failed: %d", ret);
939 ug_debug("media_info_foreach_media_from_db success!", ret);
941 __mf_ug_destroy_filter(filter);
947 int mf_ug_file_attr_get_thumbnail(void *data)
949 ug_mf_retvm_if(data == NULL, -1, "data is NULL");
951 ug_transfer_data_s *mp_data = (ug_transfer_data_s *)data;
955 memset(&filter, 0, sizeof(ug_filter_s));
957 char *condition = NULL;
958 condition = g_strdup_printf("%s and MEDIA_PATH=\"%s\"", UG_CONDITION_IMAGE_VIDEO, mp_data->file_path);
959 ug_debug("condition [%s]", condition);
960 filter.cond = condition;
961 filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;
962 filter.sort_type = MEDIA_CONTENT_ORDER_DESC;
963 filter.sort_keyword = MEDIA_MODIFIED_TIME;
964 filter.with_meta = true;
966 ret = __mf_ug_local_thumbnail_get(data, &filter);
967 UG_SAFE_FREE_CHAR(condition);
973 int mf_ug_file_attr_get_file_icon(const char *file_path, int *error_code, char **thumbnail)
976 char *icon_path = NULL;
977 mf_ug_fs_file_type ftype = UG_FILE_TYPE_NONE;
978 int thumbnail_type = MF_UG_THUMBNAIL_TYPE_DEFAULT;
979 const char *mime = NULL;
981 ug_mf_retvm_if(file_path == NULL, MF_UG_THUMBNAIL_TYPE_DEFAULT, "file_path is NULL");
984 mime = efreet_mime_type_get(file_path);
987 ug_mf_warnig("Fail to aul_get_mime_from_file(), set etc icon");
988 efreet_mime_shutdown();
989 return thumbnail_type;
992 for (index = 0; mime_type[index].mime; index++) {
993 if (strncmp(mime, mime_type[index].mime, strlen(mime)) == 0) {
994 ftype = mime_type[index].ftype;
999 icon_path = __mf_ug_file_attr_default_icon_get_by_type(ftype);
1000 ug_debug("ftype is [%d] icon_path is [%s]", ftype, icon_path);
1003 case UG_FILE_TYPE_IMAGE:
1004 case UG_FILE_TYPE_VIDEO:
1007 ug_transfer_data_s tmp_data;
1008 memset(&tmp_data,0x00,sizeof(ug_transfer_data_s));
1009 tmp_data.file_path = file_path;
1010 err = mf_ug_file_attr_get_thumbnail(&tmp_data);
1012 icon_path = g_strdup(tmp_data.thumbnail_path);
1013 thumbnail_type = MF_UG_THUMBNAIL_TYPE_THUMBNAIL;
1022 icon_path = __mf_ug_file_attr_default_icon_get_by_type(ftype);
1023 thumbnail_type = MF_UG_THUMBNAIL_TYPE_DEFAULT;
1027 ug_debug("mime [%s], file type [%d], icon_path [%s]", mime, ftype, icon_path);
1028 *thumbnail = icon_path;
1029 efreet_mime_shutdown();
1031 return thumbnail_type;
1034 static int mf_ug_file_attr_get_path_level(const char *fullpath, int *level)
1036 if (fullpath == NULL) {
1037 return MYFILE_ERR_SRC_ARG_INVALID;
1040 if (mf_ug_file_attr_is_right_dir_path(fullpath) != 0) {
1041 return MYFILE_ERR_INVALID_PATH;
1044 mf_ug_storage_type storage_t = 0;
1045 int start_level = 0;
1046 int error_code = mf_ug_file_attr_get_store_type_by_full(fullpath, &storage_t);
1047 if (error_code != 0) {
1051 if (storage_t == MF_UG_PHONE) {
1052 start_level = MF_UG_PHONE_DEFAULT_LEVEL;
1053 } else if (storage_t == MF_UG_MMC) {
1054 start_level = MF_UG_MMC_DEFAULT_LEVEL;
1057 char *temp = strdup(fullpath);
1059 return MYFILE_ERR_UNKNOW_ERROR;
1064 gchar **result = NULL;
1065 gchar **params = NULL;
1066 result = g_strsplit(temp, "/", 0);
1068 if (result == NULL) {
1071 return MYFILE_ERR_UNKNOW_ERROR;
1074 for (params = result; *params; params++) {
1079 *level = count - start_level - 1;
1081 return MYFILE_ERR_NONE;
1086 int mf_ug_file_attr_is_in_system_folder(char *fullpath, int level, bool * result)
1088 if (fullpath == NULL) {
1089 return MYFILE_ERR_SRC_ARG_INVALID;
1092 mf_ug_storage_type storage_t = 0;
1093 int error_code = mf_ug_file_attr_get_store_type_by_full(fullpath, &storage_t);
1094 if (error_code != 0) {
1098 const char *name = NULL;
1099 name = ecore_file_file_get(fullpath);
1100 char *parent_path = malloc(MYFILE_DIR_PATH_LEN_MAX + 1);
1102 if (parent_path == NULL) {
1103 return MYFILE_ERR_ALLOCATE_FAIL;
1105 memset(parent_path, 0, MYFILE_DIR_PATH_LEN_MAX + 1);
1106 error_code = mf_ug_file_attr_get_parent_path(fullpath, &parent_path);
1108 if (error_code != 0) {
1115 if (storage_t == MF_UG_PHONE || storage_t == MF_UG_MMC) {
1117 if ((strlen(name) == strlen(IMAGE_AND_VIDEO)) && strcmp(name, IMAGE_AND_VIDEO) == 0) {
1119 } else if ((strlen(name) == strlen(SOUND_AND_MUSIC)) && strcmp(name, SOUND_AND_MUSIC) == 0) {
1121 } else if ((strlen(name) == strlen(DOWNLOADS)) && strcmp(name, DOWNLOADS) == 0) {
1123 } else if ((strlen(name) == strlen(CAMERA_SHOTS)) && strcmp(name, CAMERA_SHOTS) == 0) {
1128 } else if (level == 2) {
1129 const char *parent_name = NULL;
1130 parent_name = ecore_file_file_get(parent_path);
1131 if (storage_t == MF_UG_PHONE && (strlen(parent_name) == strlen(DOWNLOADS)) && strcmp(parent_name, DOWNLOADS) == 0) {
1132 if ((strlen(name) == strlen(OTHERS)) && !strcmp(OTHERS, name)) {
1137 } else if ((strlen(parent_name) == strlen(SOUND_AND_MUSIC)) && strcmp(parent_name, SOUND_AND_MUSIC) == 0) {
1138 if ((strlen(name) == strlen(FM_RADIO)) && !strcmp(FM_RADIO, name)) {
1140 } else if ((strlen(name) == strlen(MUSIC)) && !strcmp(MUSIC, name)) {
1142 } else if ((strlen(name) == strlen(RINGTONES)) && !strcmp(RINGTONES, name)) {
1144 } else if ((strlen(name) == strlen(ALERTS)) && !strcmp(ALERTS, name)) {
1146 } else if ((strlen(name) == strlen(VOICE_RECORDER)) && !strcmp(VOICE_RECORDER, name)) {
1151 } else if ((strlen(parent_name) == strlen(IMAGE_AND_VIDEO)) && strcmp(parent_name, IMAGE_AND_VIDEO) == 0) {
1152 if ((strlen(name) == strlen(WALLPAPER)) && !strcmp(WALLPAPER, name)) {
1154 } else if ((strlen(name) == strlen(MY_PHOTO_CLIPS)) && !strcmp(MY_PHOTO_CLIPS, name)) {
1156 } else if ((strlen(name) == strlen(MY_ALBUM)) && !strcmp(MY_ALBUM, name)) {
1158 } else if ((strlen(name) == strlen(MY_VIDEO_CLIPS)) && !strcmp(MY_VIDEO_CLIPS, name)) {
1171 return MYFILE_ERR_STORAGE_TYPE_ERROR;
1181 return MYFILE_ERR_STORAGE_TYPE_ERROR;
1188 return MYFILE_ERR_NONE;
1192 int mf_ug_file_attr_is_system_dir(char *fullpath, bool * result)
1194 if (fullpath == NULL) {
1195 ug_debug("source argument invalid");
1196 return MYFILE_ERR_SRC_ARG_INVALID;
1199 if (mf_ug_file_attr_is_dir(fullpath) == 0) {
1200 ug_debug("source is not exist");
1201 return MYFILE_ERR_SRC_NOT_EXIST;
1207 error_code = mf_ug_file_attr_get_path_level(fullpath, &level);
1208 if (error_code != 0) {
1209 ug_debug("Fail to get path level");
1213 if (level >= 3 || level <= 0) {
1215 ug_debug("Path Level is wrong");
1216 return MYFILE_ERR_NONE;
1218 error_code = mf_ug_file_attr_is_in_system_folder(fullpath, level, result);
1220 if (error_code != 0) {
1221 ug_debug("Fail .. is in system folder err :: %d", error_code);
1225 return MYFILE_ERR_NONE;
1229 mf_ug_fs_file_type mf_ug_file_attr_get_file_type_by_mime(const char *file_path)
1232 mf_ug_fs_file_type ftype = UG_FILE_TYPE_NONE;
1233 const char *mime = NULL;
1235 mime = efreet_mime_type_get(file_path);
1238 ug_debug("Fail to aul_get_mime_from_file(), set etc icon");
1239 efreet_mime_shutdown();
1243 for (index = 0; mime_type[index].mime; index++) {
1244 if (strncmp(mime, mime_type[index].mime, strlen(mime)) == 0) {
1245 ftype = mime_type[index].ftype;
1249 efreet_mime_shutdown();
1254 int mf_ug_file_attr_is_duplicated_name(const char *dir, const char *name)
1257 char *file_path = g_strconcat(dir, "/", name, NULL);
1258 if (ecore_file_exists(file_path)) {
1259 UG_SAFE_FREE_CHAR(file_path);
1260 return MYFILE_ERR_DUPLICATED_NAME;
1262 UG_SAFE_FREE_CHAR(file_path);
1263 return MYFILE_ERR_NONE;
1267 int mf_ug_file_attr_get_logical_path_by_full(const char *full_path, char **path)
1269 ug_mf_retvm_if(full_path == NULL, MYFILE_ERR_INVALID_FILE_PATH, "fullpath is NULL");
1270 ug_mf_retvm_if(path == NULL, MYFILE_ERR_INVALID_FILE_PATH, "path is NULL");
1272 mf_ug_storage_type store_type = 0;
1276 error_code = mf_ug_file_attr_get_store_type_by_full(full_path, &store_type);
1278 *path = g_strdup(full_path);
1279 if (*path == NULL) {
1280 return MYFILE_ERR_ALLOCATE_MEMORY_FAIL;
1283 memset(*path, 0, strlen(*path));
1284 switch (store_type) {
1286 root_len = strlen(PHONE_FOLDER);
1289 root_len = strlen(MEMORY_FOLDER);
1292 return MYFILE_ERR_STORAGE_TYPE_ERROR;
1296 ** *path has the same length with full_path
1297 ** strlen(*path) is 0 since the memset called
1298 ** we use length of full_path to reprecent the *path's
1300 g_strlcpy(*path, full_path + root_len, strlen(full_path));
1301 if (strlen(*path) == 0) {
1302 UG_SAFE_FREE_CHAR(*path);
1303 *path = g_strdup("/");
1306 return MYFILE_ERR_NONE;