mirror of https://github.com/GNOME/gimp.git
app: support invoking file procs that handle URIs directly
*not* via the file-uri plug-in.
This commit is contained in:
parent
e97b1701ae
commit
1bf8eef14f
|
@ -147,6 +147,12 @@ file_open_image (Gimp *gimp,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file_proc->handles_uri)
|
||||||
|
{
|
||||||
|
g_free (filename);
|
||||||
|
filename = g_strdup (uri);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,7 +64,8 @@ static GimpPlugInProcedure * file_proc_find_by_prefix (GSList *procs,
|
||||||
gboolean skip_magic);
|
gboolean skip_magic);
|
||||||
static GimpPlugInProcedure * file_proc_find_by_extension (GSList *procs,
|
static GimpPlugInProcedure * file_proc_find_by_extension (GSList *procs,
|
||||||
const gchar *uri,
|
const gchar *uri,
|
||||||
gboolean skip_magic);
|
gboolean skip_magic,
|
||||||
|
gboolean uri_procs_only);
|
||||||
static GimpPlugInProcedure * file_proc_find_by_name (GSList *procs,
|
static GimpPlugInProcedure * file_proc_find_by_name (GSList *procs,
|
||||||
const gchar *uri,
|
const gchar *uri,
|
||||||
gboolean skip_magic);
|
gboolean skip_magic);
|
||||||
|
@ -93,15 +94,29 @@ file_procedure_find (GSList *procs,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GimpPlugInProcedure *file_proc;
|
GimpPlugInProcedure *file_proc;
|
||||||
GSList *all_procs = procs;
|
|
||||||
gchar *filename;
|
gchar *filename;
|
||||||
|
|
||||||
g_return_val_if_fail (procs != NULL, NULL);
|
g_return_val_if_fail (procs != NULL, NULL);
|
||||||
g_return_val_if_fail (uri != NULL, NULL);
|
g_return_val_if_fail (uri != NULL, NULL);
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
/* First, check magicless prefixes/suffixes */
|
/* First, check magicless prefixes/suffixes: */
|
||||||
file_proc = file_proc_find_by_name (all_procs, uri, TRUE);
|
|
||||||
|
if (! file_proc_find_by_extension (procs, uri, FALSE, TRUE))
|
||||||
|
{
|
||||||
|
/* If there is not any (with or without magic) file proc that
|
||||||
|
* can load the URI by extension directly, try to find a proc
|
||||||
|
* that can load the prefix
|
||||||
|
*/
|
||||||
|
file_proc = file_proc_find_by_prefix (procs, uri, TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Otherwise try to find a magicless file proc that handles the
|
||||||
|
* extension
|
||||||
|
*/
|
||||||
|
file_proc = file_proc_find_by_extension (procs, uri, TRUE, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
if (file_proc)
|
if (file_proc)
|
||||||
return file_proc;
|
return file_proc;
|
||||||
|
@ -111,6 +126,7 @@ file_procedure_find (GSList *procs,
|
||||||
/* Then look for magics */
|
/* Then look for magics */
|
||||||
if (filename)
|
if (filename)
|
||||||
{
|
{
|
||||||
|
GSList *list;
|
||||||
GimpPlugInProcedure *size_matched_proc = NULL;
|
GimpPlugInProcedure *size_matched_proc = NULL;
|
||||||
FILE *ifp = NULL;
|
FILE *ifp = NULL;
|
||||||
gboolean opened = FALSE;
|
gboolean opened = FALSE;
|
||||||
|
@ -118,10 +134,9 @@ file_procedure_find (GSList *procs,
|
||||||
gint size_match_count = 0;
|
gint size_match_count = 0;
|
||||||
guchar head[256];
|
guchar head[256];
|
||||||
|
|
||||||
while (procs)
|
for (list = procs; list; list = g_slist_next (list))
|
||||||
{
|
{
|
||||||
file_proc = procs->data;
|
file_proc = procs->data;
|
||||||
procs = procs->next;
|
|
||||||
|
|
||||||
if (file_proc->magics_list)
|
if (file_proc->magics_list)
|
||||||
{
|
{
|
||||||
|
@ -179,8 +194,8 @@ file_procedure_find (GSList *procs,
|
||||||
return size_matched_proc;
|
return size_matched_proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* As a last resort, try matching by name */
|
/* As a last resort, try matching by name, not skipping magic procs */
|
||||||
file_proc = file_proc_find_by_name (all_procs, uri, FALSE);
|
file_proc = file_proc_find_by_name (procs, uri, FALSE);
|
||||||
|
|
||||||
if (file_proc)
|
if (file_proc)
|
||||||
{
|
{
|
||||||
|
@ -213,7 +228,7 @@ file_procedure_find_by_extension (GSList *procs,
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (uri != NULL, NULL);
|
g_return_val_if_fail (uri != NULL, NULL);
|
||||||
|
|
||||||
return file_proc_find_by_extension (procs, uri, FALSE);
|
return file_proc_find_by_extension (procs, uri, FALSE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -285,14 +300,17 @@ file_proc_find_by_prefix (GSList *procs,
|
||||||
static GimpPlugInProcedure *
|
static GimpPlugInProcedure *
|
||||||
file_proc_find_by_extension (GSList *procs,
|
file_proc_find_by_extension (GSList *procs,
|
||||||
const gchar *uri,
|
const gchar *uri,
|
||||||
gboolean skip_magic)
|
gboolean skip_magic,
|
||||||
|
gboolean uri_procs_only)
|
||||||
{
|
{
|
||||||
GSList *p;
|
GSList *p;
|
||||||
const gchar *ext;
|
const gchar *ext;
|
||||||
|
|
||||||
ext = strrchr (uri, '.');
|
ext = strrchr (uri, '.');
|
||||||
|
|
||||||
if (ext)
|
if (! ext)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ext++;
|
ext++;
|
||||||
|
|
||||||
for (p = procs; p; p = g_slist_next (p))
|
for (p = procs; p; p = g_slist_next (p))
|
||||||
|
@ -300,8 +318,11 @@ file_proc_find_by_extension (GSList *procs,
|
||||||
GimpPlugInProcedure *proc = p->data;
|
GimpPlugInProcedure *proc = p->data;
|
||||||
GSList *extensions;
|
GSList *extensions;
|
||||||
|
|
||||||
|
if (uri_procs_only && ! proc->handles_uri)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (extensions = proc->extensions_list;
|
for (extensions = proc->extensions_list;
|
||||||
ext && extensions;
|
extensions;
|
||||||
extensions = g_slist_next (extensions))
|
extensions = g_slist_next (extensions))
|
||||||
{
|
{
|
||||||
const gchar *p1 = ext;
|
const gchar *p1 = ext;
|
||||||
|
@ -334,15 +355,17 @@ file_proc_find_by_name (GSList *procs,
|
||||||
{
|
{
|
||||||
GimpPlugInProcedure *proc;
|
GimpPlugInProcedure *proc;
|
||||||
|
|
||||||
|
proc = file_proc_find_by_extension (procs, uri, skip_magic, TRUE);
|
||||||
|
|
||||||
|
if (! proc)
|
||||||
proc = file_proc_find_by_prefix (procs, uri, skip_magic);
|
proc = file_proc_find_by_prefix (procs, uri, skip_magic);
|
||||||
|
|
||||||
if (! proc)
|
if (! proc)
|
||||||
proc = file_proc_find_by_extension (procs, uri, skip_magic);
|
proc = file_proc_find_by_extension (procs, uri, skip_magic, FALSE);
|
||||||
|
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
file_convert_string (const gchar *instr,
|
file_convert_string (const gchar *instr,
|
||||||
gchar *outmem,
|
gchar *outmem,
|
||||||
|
|
|
@ -127,6 +127,12 @@ file_save (Gimp *gimp,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file_proc->handles_uri)
|
||||||
|
{
|
||||||
|
g_free (filename);
|
||||||
|
filename = g_strdup (uri);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue