+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
/* GIO - GLib Input, Output and Streaming Library
*
* Copyright (C) 2006-2007 Red Hat, Inc.
#include <config.h>
#include <sys/types.h>
-#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include "gcontenttypeprivate.h"
+#include "gthemedicon.h"
#include "glibintl.h"
+#include "gioalias.h"
+
/**
* SECTION:gcontenttype
- * @short_description: platform specific content typing
+ * @short_description: Platform-specific content typing
+ * @include: gio/gio.h
*
* A content type is a platform specific string that defines the type
* of a file. On unix it is a mime type, on win32 it is an extension string
#include <windows.h>
static char *
-get_registry_classes_key (const char *subdir,
+get_registry_classes_key (const char *subdir,
const wchar_t *key_name)
{
wchar_t *wc_key;
}
gboolean
-g_content_type_is_a (const char *type,
- const char *supertype)
+g_content_type_is_a (const char *type,
+ const char *supertype)
{
gboolean res;
char *value_utf8;
}
char *
-g_content_type_get_mime_type (const char *type)
+g_content_type_get_mime_type (const char *type)
{
char *mime;
}
GIcon *
-g_content_type_get_icon (const char *type)
+g_content_type_get_icon (const char *type)
{
g_return_val_if_fail (type != NULL, NULL);
}
gboolean
-g_content_type_can_be_executable (const char *type)
+g_content_type_can_be_executable (const char *type)
{
g_return_val_if_fail (type != NULL, FALSE);
}
static gboolean
-looks_like_text (const guchar *data, gsize data_size)
+looks_like_text (const guchar *data,
+ gsize data_size)
{
gsize i;
guchar c;
#else /* !G_OS_WIN32 - Unix specific version */
+#include <dirent.h>
+
#define XDG_PREFIX _gio_xdg
#include "xdgmime/xdgmime.h"
_g_unix_content_type_get_parents (const char *type)
{
const char *umime;
- const char **parents;
+ char **parents;
GPtrArray *array;
int i;
G_LOCK (gio_xdgmime);
umime = xdg_mime_unalias_mime_type (type);
+
g_ptr_array_add (array, g_strdup (umime));
- parents = xdg_mime_get_mime_parents (umime);
+ parents = xdg_mime_list_mime_parents (umime);
for (i = 0; parents && parents[i] != NULL; i++)
g_ptr_array_add (array, g_strdup (parents[i]));
+ free (parents);
+
G_UNLOCK (gio_xdgmime);
g_ptr_array_add (array, NULL);
* %FALSE otherwise.
**/
gboolean
-g_content_type_equals (const char *type1,
- const char *type2)
+g_content_type_equals (const char *type1,
+ const char *type2)
{
gboolean res;
* %FALSE otherwise.
**/
gboolean
-g_content_type_is_a (const char *type,
- const char *supertype)
+g_content_type_is_a (const char *type,
+ const char *supertype)
{
gboolean res;
* g_content_type_is_unknown:
* @type: a content type string.
*
- * Checks if the content type is known by GIO.
+ * Checks if the content type is the generic "unknown" type.
+ * On unix this is the "application/octet-stream" mimetype,
+ * while on win32 it is "*".
*
- * Returns: %TRUE if the type is unknown.
+ * Returns: %TRUE if the type is the unknown type.
**/
gboolean
g_content_type_is_unknown (const char *type)
}
static void
-mime_info_start_element (GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **attribute_names,
- const gchar **attribute_values,
- gpointer user_data,
- GError **error)
+mime_info_start_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ gpointer user_data,
+ GError **error)
{
int i;
const char *lang;
}
static void
-mime_info_end_element (GMarkupParseContext *context,
- const gchar *element_name,
- gpointer user_data,
- GError **error)
+mime_info_end_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
{
MimeParser *parser = user_data;
}
static void
-mime_info_text (GMarkupParseContext *context,
- const gchar *text,
- gsize text_len,
- gpointer user_data,
- GError **error)
+mime_info_text (GMarkupParseContext *context,
+ const gchar *text,
+ gsize text_len,
+ gpointer user_data,
+ GError **error)
{
MimeParser *parser = user_data;
}
static char *
-load_comment_for_mime_helper (const char *dir, const char *basename)
+load_comment_for_mime_helper (const char *dir,
+ const char *basename)
{
GMarkupParseContext *context;
char *filename, *data;
g_return_val_if_fail (type != NULL, NULL);
G_LOCK (gio_xdgmime);
+ type = xdg_mime_unalias_mime_type (type);
+
if (type_comment_cache == NULL)
type_comment_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
* g_content_type_get_mime_type:
* @type: a content type string.
*
- * Gets the mime-type for the content type.
+ * Gets the mime-type for the content type. If one is registered
*
- * Returns: the registered mime-type for the given @type.
+ * Returns: the registered mime-type for the given @type, or NULL if unknown.
**/
char *
-g_content_type_get_mime_type (const char *type)
+g_content_type_get_mime_type (const char *type)
{
g_return_val_if_fail (type != NULL, NULL);
* Returns: #GIcon corresponding to the content type.
**/
GIcon *
-g_content_type_get_icon (const char *type)
+g_content_type_get_icon (const char *type)
{
+ char *mimetype_icon, *generic_mimetype_icon, *p;
+ char *icon_names[2];
+ GThemedIcon *themed_icon;
+
g_return_val_if_fail (type != NULL, NULL);
-
- /* TODO: Implement */
- return NULL;
+
+ mimetype_icon = g_strdup (type);
+
+ while ((p = strchr (mimetype_icon, '/')) != NULL)
+ *p = '-';
+
+ p = strchr (type, '/');
+ if (p == NULL)
+ p = type + strlen (type);
+
+ generic_mimetype_icon = g_malloc (p - type + strlen ("-x-generic") + 1);
+ memcpy (generic_mimetype_icon, type, p - type);
+ memcpy (generic_mimetype_icon + (p - type), "-x-generic", strlen ("-x-generic"));
+ generic_mimetype_icon[(p - type) + strlen ("-x-generic")] = 0;
+
+ icon_names[0] = mimetype_icon;
+ icon_names[1] = generic_mimetype_icon;
+
+ themed_icon = g_themed_icon_new_from_names (icon_names, 2);
+
+ g_free (mimetype_icon);
+ g_free (generic_mimetype_icon);
+
+ return G_ICON (themed_icon);
}
/**
* can be executable, %FALSE otherwise.
**/
gboolean
-g_content_type_can_be_executable (const char *type)
+g_content_type_can_be_executable (const char *type)
{
g_return_val_if_fail (type != NULL, FALSE);
looks_like_text (const guchar *data, gsize data_size)
{
gsize i;
+ char c;
+
for (i = 0; i < data_size; i++)
{
- if g_ascii_iscntrl (data[i])
+ c = data[i];
+
+ if (g_ascii_iscntrl (c) &&
+ !g_ascii_isspace (c))
return FALSE;
}
return TRUE;
return mimetype;
}
-static gboolean
-foreach_mimetype (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- GList **l = user_data;
-
- *l = g_list_prepend (*l, (char *)key);
- return TRUE;
-}
-
static void
-enumerate_mimetypes_subdir (const char *dir, const char *prefix, GHashTable *mimetypes)
+enumerate_mimetypes_subdir (const char *dir,
+ const char *prefix,
+ GHashTable *mimetypes)
{
DIR *d;
struct dirent *ent;
}
static void
-enumerate_mimetypes_dir (const char *dir, GHashTable *mimetypes)
+enumerate_mimetypes_dir (const char *dir,
+ GHashTable *mimetypes)
{
DIR *d;
struct dirent *ent;
/**
* g_content_types_get_registered:
*
- * Gets a list of strings containing the registered content types on
- * the system.
- *
+ * Gets a list of strings containing all the registered content types
+ * known to the system. The list and its data should be freed using
+ * @g_list_foreach(list, g_free, NULL) and @g_list_free(list)
* Returns: #GList of the registered content types.
**/
GList *
{
const char * const* dirs;
GHashTable *mimetypes;
+ GHashTableIter iter;
+ gpointer key;
int i;
GList *l;
- mimetypes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ mimetypes = g_hash_table_new (g_str_hash, g_str_equal);
enumerate_mimetypes_dir (g_get_user_data_dir (), mimetypes);
dirs = g_get_system_data_dirs ();
enumerate_mimetypes_dir (dirs[i], mimetypes);
l = NULL;
- g_hash_table_foreach_steal (mimetypes, foreach_mimetype, &l);
+ g_hash_table_iter_init (&iter, mimetypes);
+ while (g_hash_table_iter_next (&iter, &key, NULL))
+ l = g_list_prepend (l, key);
+
g_hash_table_destroy (mimetypes);
return l;
}
#endif /* Unix version */
+
+#define __G_CONTENT_TYPE_C__
+#include "gioaliasdef.c"