From 400876495432af53ed064a51aa29d2fc390c24b1 Mon Sep 17 00:00:00 2001 From: "aaronr%us.ibm.com" Date: Mon, 21 Aug 2006 18:51:05 +0000 Subject: [PATCH] [XForms] Implement mediatype file filters in upload. Bug 313768, patch by msterlin, r=olli+aaronr git-svn-id: svn://10.0.0.236/trunk@208025 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xforms/nsXFormsUploadElement.cpp | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp index 8b66a9e4f3d..9931062c584 100644 --- a/mozilla/extensions/xforms/nsXFormsUploadElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsUploadElement.cpp @@ -207,8 +207,55 @@ nsXFormsUploadElement::PickFile() rv = filePicker->Init(internal, filepickerTitle, nsIFilePicker::modeOpen); NS_ENSURE_SUCCESS(rv, rv); - // set filter "All Files" - // XXX implement "@mediatype" file filters + // Set the file picker filters based on the mediatype attribute. + nsAutoString mediaType; + mElement->GetAttribute(NS_LITERAL_STRING("mediatype"), mediaType); + + if (!mediaType.IsEmpty()) { + // The mediatype attribute contains a space delimited list of mime types. + nsresult rv; + nsCOMPtr mimeService = + do_GetService("@mozilla.org/mime;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsAString::const_iterator start, end, iter; + mediaType.BeginReading(start); + mediaType.BeginReading(iter); + mediaType.EndReading(end); + + nsAutoString fileFilter; + nsAutoString mimeType; + while (iter != end) { + if (FindCharInReadable(' ', iter, end)) { + mimeType = Substring(start, iter); + // Skip the space. + ++iter; + // Save the starting position for the next mime type (if any). + start = iter; + } else { + // Only 1 media type or we've reached the end of the list. + mimeType = Substring(start, end); + } + + // Map the mime type to a file extension and add the extension to the file + // type filter for the file dialog. + nsCAutoString fileExtension; + rv = mimeService->GetPrimaryExtension(NS_ConvertUTF16toUTF8(mimeType), + EmptyCString(), fileExtension); + if (NS_SUCCEEDED(rv) && !fileExtension.IsEmpty()) { + fileFilter.AppendLiteral("*."); + fileFilter.Append(NS_ConvertUTF8toUTF16(fileExtension)); + if (iter != end) { + fileFilter.AppendLiteral(";"); + } + } + } + + // Append the file extension filter. + filePicker->AppendFilter(fileFilter, fileFilter); + } + + // Always add 'All Files' filePicker->AppendFilters(nsIFilePicker::filterAll); // open dialog