winemenubuilder: Only add mime types that aren't already in freedesktop.
This commit is contained in:
parent
7d837b9f82
commit
fbb43c42a7
|
@ -1441,6 +1441,73 @@ static BOOL build_native_mime_types(const char *xdg_data_home, struct list **mim
|
||||||
return ret;
|
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,
|
static BOOL write_freedesktop_mime_type_entry(const char *packages_dir, const char *dot_extension,
|
||||||
const char *mime_type, const char *comment)
|
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);
|
contentTypeW = assoc_query(ASSOCSTR_CONTENTTYPE, extensionW, NULL);
|
||||||
if (contentTypeW == NULL)
|
|
||||||
|
if (!freedesktop_mime_type_for_extension(nativeMimeTypes, extensionA, extensionW, &mimeTypeA))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
mimeTypeA = wchars_to_utf8_chars(contentTypeW);
|
|
||||||
if (mimeTypeA == NULL)
|
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:
|
end:
|
||||||
HeapFree(GetProcessHeap(), 0, extensionA);
|
HeapFree(GetProcessHeap(), 0, extensionA);
|
||||||
|
|
Loading…
Reference in New Issue