summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2022-03-17 15:14:14 +0000
committerPhilip Withnall <philip@tecnocode.co.uk>2022-03-17 15:14:14 +0000
commit9b77b75f2dcd21b7c45e65a49a5667edf14e294b (patch)
treec7c886916a2fabb932b8c65643a34fe0882aea60
parent96279325b717cb29bd6475f0803e754ed46b3f7b (diff)
parentb0c53559c0a7cfcf27b146d83ca34ea721223191 (diff)
downloadglib-9b77b75f2dcd21b7c45e65a49a5667edf14e294b.tar.gz
Merge branch 'w32-contenttype' into 'main'
Various contenttype-related test fixes on win32 See merge request GNOME/glib!2499
-rw-r--r--gio/gcontenttype-win32.c42
-rw-r--r--gio/tests/contenttype.c29
2 files changed, 51 insertions, 20 deletions
diff --git a/gio/gcontenttype-win32.c b/gio/gcontenttype-win32.c
index 726759d8c..9b6f69ece 100644
--- a/gio/gcontenttype-win32.c
+++ b/gio/gcontenttype-win32.c
@@ -128,7 +128,8 @@ g_content_type_is_a (const gchar *type,
const gchar *supertype)
{
gboolean res;
- char *value_utf8;
+ char *perceived_type;
+ char *perceived_supertype;
g_return_val_if_fail (type != NULL, FALSE);
g_return_val_if_fail (supertype != NULL, FALSE);
@@ -136,12 +137,15 @@ g_content_type_is_a (const gchar *type,
if (g_content_type_equals (type, supertype))
return TRUE;
- res = FALSE;
- value_utf8 = get_registry_classes_key (type, L"PerceivedType");
- if (value_utf8 && strcmp (value_utf8, supertype) == 0)
- res = TRUE;
- g_free (value_utf8);
-
+ perceived_type = get_registry_classes_key (type, L"PerceivedType");
+ perceived_supertype = get_registry_classes_key (supertype, L"PerceivedType");
+
+ res = perceived_type && perceived_supertype &&
+ strcmp (perceived_type, perceived_supertype) == 0;
+
+ g_free (perceived_type);
+ g_free (perceived_supertype);
+
return res;
}
@@ -342,7 +346,8 @@ g_content_type_from_mime_type (const gchar *mime_type)
content_type = get_registry_classes_key (key, L"Extension");
g_free (key);
- return content_type;
+
+ return content_type ? g_steal_pointer (&content_type) : g_strdup ("*");
}
gchar *
@@ -354,6 +359,7 @@ g_content_type_guess (const gchar *filename,
char *basename;
char *type;
char *dot;
+ size_t i;
type = NULL;
@@ -366,11 +372,21 @@ g_content_type_guess (const gchar *filename,
if (filename)
{
- basename = g_path_get_basename (filename);
- dot = strrchr (basename, '.');
- if (dot)
- type = g_strdup (dot);
- g_free (basename);
+ i = strlen (filename);
+ if (i > 0 && filename[i - 1] == G_DIR_SEPARATOR)
+ {
+ type = g_strdup ("inode/directory");
+ if (result_uncertain)
+ *result_uncertain = TRUE;
+ }
+ else
+ {
+ basename = g_path_get_basename (filename);
+ dot = strrchr (basename, '.');
+ if (dot)
+ type = g_strdup (dot);
+ g_free (basename);
+ }
}
if (type)
diff --git a/gio/tests/contenttype.c b/gio/tests/contenttype.c
index 10b795a05..6cfd366ff 100644
--- a/gio/tests/contenttype.c
+++ b/gio/tests/contenttype.c
@@ -30,7 +30,7 @@ test_guess (void)
existing_directory = (gchar *) g_getenv ("SYSTEMROOT");
if (existing_directory)
- existing_directory = g_strdup_printf ("%s/", existing_directory);
+ existing_directory = g_strdup_printf ("%s" G_DIR_SEPARATOR_S, existing_directory);
#else
existing_directory = g_strdup ("/etc/");
#endif
@@ -56,7 +56,8 @@ test_guess (void)
g_free (res);
g_free (expected);
- /* Sadly OSX just doesn't have as large and robust of a mime type database as Linux */
+ /* Sadly win32 & OSX just don't have as large and robust of a mime type database as Linux */
+#ifndef G_OS_WIN32
#ifndef __APPLE__
res = g_content_type_guess ("foo", data, sizeof (data) - 1, &uncertain);
expected = g_content_type_from_mime_type ("text/plain");
@@ -110,7 +111,7 @@ test_guess (void)
g_assert_false (uncertain);
g_free (res);
g_free (expected);
-#endif
+#endif /* __APPLE__ */
res = g_content_type_guess (NULL, (guchar *)"%!PS-Adobe-2.0 EPSF-1.2", 23, &uncertain);
expected = g_content_type_from_mime_type ("image/x-eps");
@@ -126,6 +127,7 @@ test_guess (void)
g_assert_false (uncertain);
g_free (res);
g_free (expected);
+#endif /* G_OS_WIN32 */
}
static void
@@ -200,6 +202,13 @@ test_executable (void)
{
gchar *type;
+#ifdef G_OS_WIN32
+ type = g_content_type_from_mime_type ("application/vnd.microsoft.portable-executable");
+ /* FIXME: the MIME is not in the default `MIME\Database\Content Type` registry.
+ * g_assert_true (g_content_type_can_be_executable (type));
+ */
+ g_free (type);
+#else
type = g_content_type_from_mime_type ("application/x-executable");
g_assert_true (g_content_type_can_be_executable (type));
g_free (type);
@@ -207,7 +216,7 @@ test_executable (void)
type = g_content_type_from_mime_type ("text/plain");
g_assert_true (g_content_type_can_be_executable (type));
g_free (type);
-
+#endif
type = g_content_type_from_mime_type ("image/png");
g_assert_false (g_content_type_can_be_executable (type));
g_free (type);
@@ -244,7 +253,9 @@ test_icon (void)
#ifdef __APPLE__
g_assert_true (g_strv_contains (names, "text-*"));
#else
+#ifndef G_OS_WIN32
g_assert_true (g_strv_contains (names, "text-plain"));
+#endif
g_assert_true (g_strv_contains (names, "text-x-generic"));
#endif
}
@@ -259,10 +270,14 @@ test_icon (void)
const gchar *const *names;
names = g_themed_icon_get_names (G_THEMED_ICON (icon));
+#ifdef G_OS_WIN32
+ g_assert_true (g_strv_contains (names, "text-x-generic"));
+#else
g_assert_true (g_strv_contains (names, "application-rtf"));
#ifndef __APPLE__
g_assert_true (g_strv_contains (names, "x-office-document"));
#endif
+#endif
}
g_object_unref (icon);
g_free (type);
@@ -329,8 +344,8 @@ test_tree (void)
gchar **types;
gsize i;
-#ifdef __APPLE__
- g_test_skip ("The OSX backend does not implement g_content_type_guess_for_tree()");
+#if defined(__APPLE__) || defined(G_OS_WIN32)
+ g_test_skip ("The OSX & Windows backends do not implement g_content_type_guess_for_tree()");
return;
#endif
@@ -355,7 +370,7 @@ test_type_is_a_special_case (void)
/* Everything but the inode type is application/octet-stream */
res = g_content_type_is_a ("inode/directory", "application/octet-stream");
g_assert_false (res);
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(G_OS_WIN32)
res = g_content_type_is_a ("anything", "application/octet-stream");
g_assert_true (res);
#endif