]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-document-factory.c
Fixes bug #542924. Makes enums static to fix Solaris build.
[evince.git] / libdocument / ev-document-factory.c
index 21e0b4a9a8f29401d6fbc655c1ea87eac44f4a4e..64eaabaa25d52ac37487db5cf3367ab05c6dbca9 100644 (file)
 #endif
 
 #include <string.h>
 #endif
 
 #include <string.h>
+#include <gio/gio.h>
 #include <glib/gstdio.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <glib/gi18n.h>
-#include <libgnomevfs/gnome-vfs-mime-utils.h>
-#include <libgnomevfs/gnome-vfs-file-info.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
 #include <gtk/gtkfilechooserdialog.h>
 
 #include "ev-backends-manager.h"
 #include <gtk/gtkfilechooserdialog.h>
 
 #include "ev-backends-manager.h"
@@ -105,6 +103,58 @@ get_compression_from_mime_type (const gchar *mime_type)
        return EV_COMPRESSION_NONE;
 }
 
        return EV_COMPRESSION_NONE;
 }
 
+static gchar *
+get_mime_type_from_uri (const gchar *uri, GError **error)
+{
+       GFile     *file;
+       GFileInfo *file_info;
+       gchar     *mime_type;
+
+       file = g_file_new_for_uri (uri);
+       file_info = g_file_query_info (file,
+                                      G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+                                      0, NULL, error);
+       g_object_unref (file);
+
+       if (file_info == NULL)
+               return NULL;
+
+       mime_type = g_strdup (g_file_info_get_content_type (file_info));
+       g_object_unref (file_info);
+
+       return mime_type;
+}
+
+static gchar *
+get_mime_type_from_data (const gchar *uri, GError **error)
+{
+       GFile            *file;
+       GFileInputStream *input_stream;
+       gssize            size_read;
+       guchar            buffer[1024];
+
+       file = g_file_new_for_uri (uri);
+       
+       input_stream = g_file_read (file, NULL, error);
+       if (!input_stream) {
+               g_object_unref (file);
+               return NULL;
+       }
+
+       size_read = g_input_stream_read (G_INPUT_STREAM (input_stream),
+                                        buffer, 1024, NULL, NULL);
+       g_input_stream_close (G_INPUT_STREAM (input_stream), NULL, NULL);
+
+       g_object_unref (file);
+
+       if (size_read == -1)
+               return NULL;
+
+       return g_content_type_guess (NULL, /* no filename */
+                                    buffer, 1024,
+                                    NULL);
+}
+
 static EvDocument *
 get_document_from_uri (const char        *uri,
                       gboolean           slow,
 static EvDocument *
 get_document_from_uri (const char        *uri,
                       gboolean           slow,
@@ -112,55 +162,45 @@ get_document_from_uri (const char        *uri,
                       GError           **error)
 {
        EvDocument *document = NULL;
                       GError           **error)
 {
        EvDocument *document = NULL;
-        GnomeVFSFileInfo *info;
-        GnomeVFSResult result;
+       gchar      *mime_type = NULL;
 
        *compression = EV_COMPRESSION_NONE;
 
 
        *compression = EV_COMPRESSION_NONE;
 
-        info = gnome_vfs_file_info_new ();
-        result = gnome_vfs_get_file_info (uri, info,
-                                         GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
-                                         GNOME_VFS_FILE_INFO_FOLLOW_LINKS | 
-                                         (slow ? GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE : 0));
-        if (result != GNOME_VFS_OK) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR,
-                            0,
-                            gnome_vfs_result_to_string (result));                      
-               gnome_vfs_file_info_unref (info);
-               return NULL;
-        } 
-       
-       if (info->mime_type == NULL) {
-               g_set_error (error,
-                            EV_DOCUMENT_ERROR, 
-                            0,
-                            _("Unknown MIME Type"));
-               gnome_vfs_file_info_unref (info);
+       mime_type = slow ?
+               get_mime_type_from_data (uri, error) :
+               get_mime_type_from_uri (uri, error);
+
+       if (mime_type == NULL) {
+               g_free (mime_type);
+               
                return NULL;
        }
 
                return NULL;
        }
 
+       document = ev_backends_manager_get_document (mime_type);
+       
 #ifdef ENABLE_PIXBUF
 #ifdef ENABLE_PIXBUF
-       if (mime_type_supported_by_gdk_pixbuf (info->mime_type)) {
+       if (!document && mime_type_supported_by_gdk_pixbuf (mime_type))
                document = ev_backends_manager_get_document ("image/*");
                document = ev_backends_manager_get_document ("image/*");
-       } else
-               document = ev_backends_manager_get_document (info->mime_type);
-#else
-       document = ev_backends_manager_get_document (info->mime_type);
 #endif /* ENABLE_PIXBUF */
 
        if (document == NULL) {
 #endif /* ENABLE_PIXBUF */
 
        if (document == NULL) {
+               gchar *mime_desc;
+
+               mime_desc = g_content_type_get_description (mime_type);
                g_set_error (error,
                             EV_DOCUMENT_ERROR, 
                             0,
                g_set_error (error,
                             EV_DOCUMENT_ERROR, 
                             0,
-                            _("Unhandled MIME type: ā€œ%sā€"), info->mime_type);
-               gnome_vfs_file_info_unref (info);
+                            _("File type %s (%s) is not supported"),
+                            mime_desc, mime_type);
+               g_free (mime_desc);
+               g_free (mime_type);
+
                return NULL;
        }
 
                return NULL;
        }
 
-       *compression = get_compression_from_mime_type (info->mime_type);
+       *compression = get_compression_from_mime_type (mime_type);
 
 
-        gnome_vfs_file_info_unref (info);
+       g_free (mime_type);
        
         return document;
 }
        
         return document;
 }