diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c index 7777c66b..8c00c95a 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -2515,6 +2515,106 @@ zero_get_func (void* params, } +/* Find the file type based on extension */ +/* from libmtp/examples/pathutils.c */ +static LIBMTP_filetype_t +find_filetype (const char * filename) +{ + char *ptype; + LIBMTP_filetype_t filetype; + +#ifdef __WIN32__ + ptype = strrchr(filename, '.'); +#else + ptype = rindex(filename,'.'); +#endif + // This accounts for the case with a filename without any "." (period). + if (!ptype) { + ptype = ""; + } else { + ++ptype; + } + + /* This need to be kept constantly updated as new file types arrive. */ + if (!strcasecmp (ptype, "wav")) { + filetype = LIBMTP_FILETYPE_WAV; + } else if (!strcasecmp (ptype, "mp3")) { + filetype = LIBMTP_FILETYPE_MP3; + } else if (!strcasecmp (ptype, "wma")) { + filetype = LIBMTP_FILETYPE_WMA; + } else if (!strcasecmp (ptype, "ogg")) { + filetype = LIBMTP_FILETYPE_OGG; + } else if (!strcasecmp (ptype, "mp4")) { + filetype = LIBMTP_FILETYPE_MP4; + } else if (!strcasecmp (ptype, "wmv")) { + filetype = LIBMTP_FILETYPE_WMV; + } else if (!strcasecmp (ptype, "avi")) { + filetype = LIBMTP_FILETYPE_AVI; + } else if (!strcasecmp (ptype, "mpeg") || !strcasecmp (ptype, "mpg")) { + filetype = LIBMTP_FILETYPE_MPEG; + } else if (!strcasecmp (ptype, "asf")) { + filetype = LIBMTP_FILETYPE_ASF; + } else if (!strcasecmp (ptype, "qt") || !strcasecmp (ptype, "mov")) { + filetype = LIBMTP_FILETYPE_QT; + } else if (!strcasecmp (ptype, "wma")) { + filetype = LIBMTP_FILETYPE_WMA; + } else if (!strcasecmp (ptype, "jpg") || !strcasecmp (ptype, "jpeg")) { + filetype = LIBMTP_FILETYPE_JPEG; + } else if (!strcasecmp (ptype, "jfif")) { + filetype = LIBMTP_FILETYPE_JFIF; + } else if (!strcasecmp (ptype, "tif") || !strcasecmp (ptype, "tiff")) { + filetype = LIBMTP_FILETYPE_TIFF; + } else if (!strcasecmp (ptype, "bmp")) { + filetype = LIBMTP_FILETYPE_BMP; + } else if (!strcasecmp (ptype, "gif")) { + filetype = LIBMTP_FILETYPE_GIF; + } else if (!strcasecmp (ptype, "pic") || !strcasecmp (ptype, "pict")) { + filetype = LIBMTP_FILETYPE_PICT; + } else if (!strcasecmp (ptype, "png")) { + filetype = LIBMTP_FILETYPE_PNG; + } else if (!strcasecmp (ptype, "wmf")) { + filetype = LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT; + } else if (!strcasecmp (ptype, "ics")) { + filetype = LIBMTP_FILETYPE_VCALENDAR2; + } else if (!strcasecmp (ptype, "exe") || !strcasecmp (ptype, "com") || + !strcasecmp (ptype, "bat") || !strcasecmp (ptype, "dll") || + !strcasecmp (ptype, "sys")) { + filetype = LIBMTP_FILETYPE_WINEXEC; + } else if (!strcasecmp (ptype, "aac")) { + filetype = LIBMTP_FILETYPE_AAC; + } else if (!strcasecmp (ptype, "mp2")) { + filetype = LIBMTP_FILETYPE_MP2; + } else if (!strcasecmp (ptype, "flac")) { + filetype = LIBMTP_FILETYPE_FLAC; + } else if (!strcasecmp (ptype, "m4a")) { + filetype = LIBMTP_FILETYPE_M4A; + } else if (!strcasecmp (ptype, "doc")) { + filetype = LIBMTP_FILETYPE_DOC; + } else if (!strcasecmp (ptype, "xml")) { + filetype = LIBMTP_FILETYPE_XML; + } else if (!strcasecmp (ptype, "xls")) { + filetype = LIBMTP_FILETYPE_XLS; + } else if (!strcasecmp (ptype, "ppt")) { + filetype = LIBMTP_FILETYPE_PPT; + } else if (!strcasecmp (ptype, "mht")) { + filetype = LIBMTP_FILETYPE_MHT; + } else if (!strcasecmp (ptype, "jp2")) { + filetype = LIBMTP_FILETYPE_JP2; + } else if (!strcasecmp (ptype, "jpx")) { + filetype = LIBMTP_FILETYPE_JPX; + } else if (!strcasecmp (ptype, "bin")) { + filetype = LIBMTP_FILETYPE_FIRMWARE; + } else if (!strcasecmp (ptype, "vcf")) { + filetype = LIBMTP_FILETYPE_VCARD3; + } else { + /* Tagging as unknown file type */ + filetype = LIBMTP_FILETYPE_UNKNOWN; + } + g_debug ("(II) type: %s, %d\n", ptype, filetype); + return filetype; +} + + static void do_create (GVfsBackend *backend, GVfsJobOpenForWrite *job, @@ -2559,7 +2659,7 @@ do_create (GVfsBackend *backend, mtpfile->filename = strdup (basename); mtpfile->parent_id = entry->id; mtpfile->storage_id = entry->storage; - mtpfile->filetype = LIBMTP_FILETYPE_UNKNOWN; + mtpfile->filetype = find_filetype(basename); mtpfile->filesize = 0; int ret = LIBMTP_Send_File_From_Handler (device, zero_get_func, NULL,