Damjan Jovanovic : winemenubuilder: Only add mime types that aren' t already in freedesktop.
Alexandre Julliard
julliard at winehq.org
Fri May 29 09:15:52 CDT 2009
Module: wine
Branch: master
Commit: fbb43c42a752039544daed980f7e590134be475a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fbb43c42a752039544daed980f7e590134be475a
Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date: Wed May 27 19:07:32 2009 +0200
winemenubuilder: Only add mime types that aren't already in freedesktop.
---
programs/winemenubuilder/winemenubuilder.c | 89 ++++++++++++++++++++++++++-
1 files changed, 85 insertions(+), 4 deletions(-)
diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 2e63168..2e87ca5 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -1441,6 +1441,73 @@ static BOOL build_native_mime_types(const char *xdg_data_home, struct list **mim
return ret;
}
+static BOOL match_glob(struct list *native_mime_types, const char *extension,
+ char **match)
+{
+ struct xdg_mime_type *mime_type_entry;
+ int matchLength = 0;
+
+ *match = NULL;
+
+ LIST_FOR_EACH_ENTRY(mime_type_entry, native_mime_types, struct xdg_mime_type, entry)
+ {
+ if (fnmatch(mime_type_entry->glob, extension, 0) == 0)
+ {
+ if (*match == NULL || matchLength < strlen(mime_type_entry->glob))
+ {
+ *match = mime_type_entry->mimeType;
+ matchLength = strlen(mime_type_entry->glob);
+ }
+ }
+ }
+
+ if (*match != NULL)
+ {
+ *match = heap_printf("%s", *match);
+ if (*match == NULL)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static BOOL freedesktop_mime_type_for_extension(struct list *native_mime_types,
+ const char *extensionA,
+ LPCWSTR extensionW,
+ char **mime_type)
+{
+ WCHAR *lower_extensionW;
+ INT len;
+ BOOL ret = match_glob(native_mime_types, extensionA, mime_type);
+ if (ret == FALSE || *mime_type != NULL)
+ return ret;
+ len = strlenW(extensionW);
+ lower_extensionW = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
+ if (lower_extensionW)
+ {
+ char *lower_extensionA;
+ memcpy(lower_extensionW, extensionW, (len + 1)*sizeof(WCHAR));
+ strlwrW(lower_extensionW);
+ lower_extensionA = wchars_to_utf8_chars(lower_extensionW);
+ if (lower_extensionA)
+ {
+ ret = match_glob(native_mime_types, lower_extensionA, mime_type);
+ HeapFree(GetProcessHeap(), 0, lower_extensionA);
+ }
+ else
+ {
+ ret = FALSE;
+ WINE_FIXME("out of memory\n");
+ }
+ HeapFree(GetProcessHeap(), 0, lower_extensionW);
+ }
+ else
+ {
+ ret = FALSE;
+ WINE_FIXME("out of memory\n");
+ }
+ return ret;
+}
+
static BOOL write_freedesktop_mime_type_entry(const char *packages_dir, const char *dot_extension,
const char *mime_type, const char *comment)
{
@@ -1541,14 +1608,28 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package
}
contentTypeW = assoc_query(ASSOCSTR_CONTENTTYPE, extensionW, NULL);
- if (contentTypeW == NULL)
+
+ if (!freedesktop_mime_type_for_extension(nativeMimeTypes, extensionA, extensionW, &mimeTypeA))
goto end;
- mimeTypeA = wchars_to_utf8_chars(contentTypeW);
if (mimeTypeA == NULL)
- goto end;
+ {
+ if (contentTypeW != NULL)
+ mimeTypeA = wchars_to_utf8_chars(contentTypeW);
+ else
+ mimeTypeA = heap_printf("application/x-wine-extension-%s", &extensionA[1]);
- write_freedesktop_mime_type_entry(packages_dir, extensionA, mimeTypeA, friendlyDocNameA);
+ if (mimeTypeA != NULL)
+ {
+ write_freedesktop_mime_type_entry(packages_dir, extensionA, mimeTypeA, friendlyDocNameA);
+ hasChanged = TRUE;
+ }
+ else
+ {
+ WINE_FIXME("out of memory\n");
+ goto end;
+ }
+ }
end:
HeapFree(GetProcessHeap(), 0, extensionA);
More information about the wine-cvs
mailing list