mirror of https://github.com/GNOME/gimp.git
plug-ins/help/Makefile.am plug-ins/help/gimphelpdomain.[ch]
2008-04-02 Sven Neumann <sven@gimp.org> * plug-ins/help/Makefile.am * plug-ins/help/gimphelpdomain.[ch] * plug-ins/help/gimphelplocale.[ch] * plug-ins/help/gimphelp.[ch] * plug-ins/help/gimp-help-lookup.c: use GIO to access the help index. svn path=/trunk/; revision=25331
This commit is contained in:
parent
3a3e1b90d9
commit
4ecea2402d
|
@ -1,3 +1,11 @@
|
||||||
|
2008-04-02 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
|
* plug-ins/help/Makefile.am
|
||||||
|
* plug-ins/help/gimphelpdomain.[ch]
|
||||||
|
* plug-ins/help/gimphelplocale.[ch]
|
||||||
|
* plug-ins/help/gimphelp.[ch]
|
||||||
|
* plug-ins/help/gimp-help-lookup.c: use GIO to access the help index.
|
||||||
|
|
||||||
2008-04-01 Sven Neumann <sven@gimp.org>
|
2008-04-01 Sven Neumann <sven@gimp.org>
|
||||||
|
|
||||||
* app/display/gimpdisplayshell-title.c
|
* app/display/gimpdisplayshell-title.c
|
||||||
|
|
|
@ -35,7 +35,7 @@ help_SOURCES = help.c
|
||||||
|
|
||||||
INCLUDES = \
|
INCLUDES = \
|
||||||
-I$(top_srcdir) \
|
-I$(top_srcdir) \
|
||||||
$(GLIB_CFLAGS) \
|
$(GIO_CFLAGS) \
|
||||||
-I$(includedir)
|
-I$(includedir)
|
||||||
|
|
||||||
LDADD = \
|
LDADD = \
|
||||||
|
@ -44,7 +44,7 @@ LDADD = \
|
||||||
$(libgimpcolor) \
|
$(libgimpcolor) \
|
||||||
$(libgimpbase) \
|
$(libgimpbase) \
|
||||||
$(libgimpmath) \
|
$(libgimpmath) \
|
||||||
$(GLIB_LIBS) \
|
$(GIO_LIBS) \
|
||||||
$(RT_LIBS) \
|
$(RT_LIBS) \
|
||||||
$(INTLLIBS)
|
$(INTLLIBS)
|
||||||
|
|
||||||
|
@ -56,4 +56,4 @@ gimp_help_lookup_SOURCES = gimp-help-lookup.c
|
||||||
gimp_help_lookup_LDADD = \
|
gimp_help_lookup_LDADD = \
|
||||||
$(libgimphelp) \
|
$(libgimphelp) \
|
||||||
$(libgimpbase) \
|
$(libgimpbase) \
|
||||||
$(GLIB_LIBS)
|
$(GIO_LIBS)
|
||||||
|
|
|
@ -80,7 +80,7 @@ main (gint argc,
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
help_base = g_getenv (GIMP_HELP_ENV_URI);
|
help_base = g_getenv (GIMP_HELP_ENV_URI);
|
||||||
help_root = g_build_path (G_DIR_SEPARATOR_S, gimp_data_directory (), GIMP_HELP_PREFIX, NULL);
|
help_root = g_build_filename (gimp_data_directory (), GIMP_HELP_PREFIX, NULL);
|
||||||
|
|
||||||
context = g_option_context_new ("HELP-ID");
|
context = g_option_context_new ("HELP-ID");
|
||||||
g_option_context_add_main_entries (context, entries, NULL);
|
g_option_context_add_main_entries (context, entries, NULL);
|
||||||
|
@ -91,12 +91,14 @@ main (gint argc,
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_type_init ();
|
||||||
|
|
||||||
if (help_base)
|
if (help_base)
|
||||||
uri = g_strdup (help_base);
|
uri = g_strdup (help_base);
|
||||||
else
|
else
|
||||||
uri = g_filename_to_uri (help_root, NULL, NULL);
|
uri = g_filename_to_uri (help_root, NULL, NULL);
|
||||||
|
|
||||||
gimp_help_register_domain (GIMP_HELP_DEFAULT_DOMAIN, uri, help_root);
|
gimp_help_register_domain (GIMP_HELP_DEFAULT_DOMAIN, uri);
|
||||||
g_free (uri);
|
g_free (uri);
|
||||||
|
|
||||||
uri = lookup (GIMP_HELP_DEFAULT_DOMAIN,
|
uri = lookup (GIMP_HELP_DEFAULT_DOMAIN,
|
||||||
|
|
|
@ -84,13 +84,10 @@ gimp_help_init (gint num_domain_names,
|
||||||
g_free (help_root);
|
g_free (help_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
gimp_help_register_domain (GIMP_HELP_DEFAULT_DOMAIN,
|
gimp_help_register_domain (GIMP_HELP_DEFAULT_DOMAIN, default_domain_uri);
|
||||||
default_domain_uri, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < num_domain_names; i++)
|
for (i = 0; i < num_domain_names; i++)
|
||||||
{
|
gimp_help_register_domain (domain_names[i], domain_uris[i]);
|
||||||
gimp_help_register_domain (domain_names[i], domain_uris[i], NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (default_domain_uri);
|
g_free (default_domain_uri);
|
||||||
|
|
||||||
|
@ -109,8 +106,7 @@ gimp_help_exit (void)
|
||||||
|
|
||||||
void
|
void
|
||||||
gimp_help_register_domain (const gchar *domain_name,
|
gimp_help_register_domain (const gchar *domain_name,
|
||||||
const gchar *domain_uri,
|
const gchar *domain_uri)
|
||||||
const gchar *domain_root)
|
|
||||||
{
|
{
|
||||||
g_return_if_fail (domain_name != NULL);
|
g_return_if_fail (domain_name != NULL);
|
||||||
g_return_if_fail (domain_uri != NULL);
|
g_return_if_fail (domain_uri != NULL);
|
||||||
|
@ -127,8 +123,7 @@ gimp_help_register_domain (const gchar *domain_name,
|
||||||
|
|
||||||
g_hash_table_insert (domain_hash,
|
g_hash_table_insert (domain_hash,
|
||||||
g_strdup (domain_name),
|
g_strdup (domain_name),
|
||||||
gimp_help_domain_new (domain_name,
|
gimp_help_domain_new (domain_name, domain_uri));
|
||||||
domain_uri, domain_root));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GimpHelpDomain *
|
GimpHelpDomain *
|
||||||
|
|
|
@ -49,8 +49,7 @@ gboolean gimp_help_init (gint n_domain_names,
|
||||||
void gimp_help_exit (void);
|
void gimp_help_exit (void);
|
||||||
|
|
||||||
void gimp_help_register_domain (const gchar *domain_name,
|
void gimp_help_register_domain (const gchar *domain_name,
|
||||||
const gchar *domain_uri,
|
const gchar *domain_uri);
|
||||||
const gchar *domain_root);
|
|
||||||
GimpHelpDomain * gimp_help_lookup_domain (const gchar *domain_name);
|
GimpHelpDomain * gimp_help_lookup_domain (const gchar *domain_name);
|
||||||
|
|
||||||
GList * gimp_help_parse_locales (const gchar *help_locales);
|
GList * gimp_help_parse_locales (const gchar *help_locales);
|
||||||
|
|
|
@ -48,21 +48,17 @@ static gboolean domain_locale_parse (GimpHelpDomain *domain,
|
||||||
GimpHelpLocale *locale,
|
GimpHelpLocale *locale,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
static gchar * domain_filename_from_uri (const gchar *uri);
|
|
||||||
|
|
||||||
|
|
||||||
/* public functions */
|
/* public functions */
|
||||||
|
|
||||||
GimpHelpDomain *
|
GimpHelpDomain *
|
||||||
gimp_help_domain_new (const gchar *domain_name,
|
gimp_help_domain_new (const gchar *domain_name,
|
||||||
const gchar *domain_uri,
|
const gchar *domain_uri)
|
||||||
const gchar *domain_root)
|
|
||||||
{
|
{
|
||||||
GimpHelpDomain *domain = g_slice_new0 (GimpHelpDomain);
|
GimpHelpDomain *domain = g_slice_new0 (GimpHelpDomain);
|
||||||
|
|
||||||
domain->help_domain = g_strdup (domain_name);
|
domain->help_domain = g_strdup (domain_name);
|
||||||
domain->help_uri = g_strdup (domain_uri);
|
domain->help_uri = g_strdup (domain_uri);
|
||||||
domain->help_root = g_strdup (domain_root);
|
|
||||||
|
|
||||||
if (domain_uri)
|
if (domain_uri)
|
||||||
{
|
{
|
||||||
|
@ -84,7 +80,6 @@ gimp_help_domain_free (GimpHelpDomain *domain)
|
||||||
|
|
||||||
g_free (domain->help_domain);
|
g_free (domain->help_domain);
|
||||||
g_free (domain->help_uri);
|
g_free (domain->help_uri);
|
||||||
g_free (domain->help_root);
|
|
||||||
|
|
||||||
g_slice_free (GimpHelpDomain, domain);
|
g_slice_free (GimpHelpDomain, domain);
|
||||||
}
|
}
|
||||||
|
@ -209,70 +204,19 @@ domain_locale_parse (GimpHelpDomain *domain,
|
||||||
GimpHelpLocale *locale,
|
GimpHelpLocale *locale,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gchar *filename;
|
gchar *uri;
|
||||||
gboolean success;
|
gboolean success;
|
||||||
|
|
||||||
g_return_val_if_fail (domain != NULL, FALSE);
|
g_return_val_if_fail (domain != NULL, FALSE);
|
||||||
g_return_val_if_fail (locale != NULL, FALSE);
|
g_return_val_if_fail (locale != NULL, FALSE);
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
if (! domain->help_root)
|
uri = g_strdup_printf ("%s/%s/gimp-help.xml",
|
||||||
domain->help_root = domain_filename_from_uri (domain->help_uri);
|
domain->help_uri, locale->locale_id);
|
||||||
|
|
||||||
if (! domain->help_root)
|
success = gimp_help_locale_parse (locale, uri, domain->help_domain, error);
|
||||||
{
|
|
||||||
g_set_error (error, 0, 0,
|
|
||||||
"Cannot determine location of gimp-help.xml from '%s'",
|
|
||||||
domain->help_uri);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
filename = g_build_filename (domain->help_root,
|
g_free (uri);
|
||||||
locale->locale_id,
|
|
||||||
"gimp-help.xml",
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
success = gimp_help_locale_parse (locale,
|
|
||||||
filename,
|
|
||||||
domain->help_domain,
|
|
||||||
error);
|
|
||||||
|
|
||||||
g_free (filename);
|
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
|
||||||
domain_filename_from_uri (const gchar *uri)
|
|
||||||
{
|
|
||||||
gchar *filename;
|
|
||||||
gchar *hostname;
|
|
||||||
|
|
||||||
g_return_val_if_fail (uri != NULL, NULL);
|
|
||||||
|
|
||||||
filename = g_filename_from_uri (uri, &hostname, NULL);
|
|
||||||
|
|
||||||
if (!filename)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (hostname)
|
|
||||||
{
|
|
||||||
/* we have a file: URI with a hostname */
|
|
||||||
#ifdef G_OS_WIN32
|
|
||||||
/* on Win32, create a valid UNC path and use it as the filename */
|
|
||||||
|
|
||||||
gchar *tmp = g_build_filename ("//", hostname, filename, NULL);
|
|
||||||
|
|
||||||
g_free (filename);
|
|
||||||
filename = tmp;
|
|
||||||
#else
|
|
||||||
/* otherwise return NULL, caller should use URI then */
|
|
||||||
g_free (filename);
|
|
||||||
filename = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_free (hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
|
@ -29,14 +29,12 @@ struct _GimpHelpDomain
|
||||||
{
|
{
|
||||||
gchar *help_domain;
|
gchar *help_domain;
|
||||||
gchar *help_uri;
|
gchar *help_uri;
|
||||||
gchar *help_root;
|
|
||||||
GHashTable *help_locales;
|
GHashTable *help_locales;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
GimpHelpDomain * gimp_help_domain_new (const gchar *domain_name,
|
GimpHelpDomain * gimp_help_domain_new (const gchar *domain_name,
|
||||||
const gchar *domain_uri,
|
const gchar *domain_uri);
|
||||||
const gchar *domain_root);
|
|
||||||
void gimp_help_domain_free (GimpHelpDomain *domain);
|
void gimp_help_domain_free (GimpHelpDomain *domain);
|
||||||
|
|
||||||
GimpHelpLocale * gimp_help_domain_lookup_locale (GimpHelpDomain *domain,
|
GimpHelpLocale * gimp_help_domain_lookup_locale (GimpHelpDomain *domain,
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib-object.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
#include "gimphelp.h"
|
#include "gimphelp.h"
|
||||||
|
|
||||||
|
@ -44,7 +45,7 @@
|
||||||
|
|
||||||
static void locale_set_error (GError **error,
|
static void locale_set_error (GError **error,
|
||||||
const gchar *format,
|
const gchar *format,
|
||||||
const gchar *filename);
|
GFile *file);
|
||||||
|
|
||||||
|
|
||||||
/* public functions */
|
/* public functions */
|
||||||
|
@ -103,7 +104,7 @@ typedef enum
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const gchar *filename;
|
GFile *file;
|
||||||
LocaleParserState state;
|
LocaleParserState state;
|
||||||
LocaleParserState last_known_state;
|
LocaleParserState last_known_state;
|
||||||
gint markup_depth;
|
gint markup_depth;
|
||||||
|
@ -116,7 +117,7 @@ typedef struct
|
||||||
} LocaleParser;
|
} LocaleParser;
|
||||||
|
|
||||||
static gboolean locale_parser_parse (GMarkupParseContext *context,
|
static gboolean locale_parser_parse (GMarkupParseContext *context,
|
||||||
GIOChannel *io,
|
GInputStream *stream,
|
||||||
GError **error);
|
GError **error);
|
||||||
static void locale_parser_start_element (GMarkupParseContext *context,
|
static void locale_parser_start_element (GMarkupParseContext *context,
|
||||||
const gchar *element_name,
|
const gchar *element_name,
|
||||||
|
@ -154,17 +155,18 @@ static const GMarkupParser markup_parser =
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gimp_help_locale_parse (GimpHelpLocale *locale,
|
gimp_help_locale_parse (GimpHelpLocale *locale,
|
||||||
const gchar *filename,
|
const gchar *uri,
|
||||||
const gchar *help_domain,
|
const gchar *help_domain,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GMarkupParseContext *context;
|
GMarkupParseContext *context;
|
||||||
GIOChannel *io;
|
GFile *file;
|
||||||
|
GFileInputStream *stream;
|
||||||
LocaleParser parser = { NULL, };
|
LocaleParser parser = { NULL, };
|
||||||
gboolean success;
|
gboolean success;
|
||||||
|
|
||||||
g_return_val_if_fail (locale != NULL, FALSE);
|
g_return_val_if_fail (locale != NULL, FALSE);
|
||||||
g_return_val_if_fail (filename != NULL, FALSE);
|
g_return_val_if_fail (uri != NULL, FALSE);
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
if (locale->help_id_mapping)
|
if (locale->help_id_mapping)
|
||||||
|
@ -181,21 +183,22 @@ gimp_help_locale_parse (GimpHelpLocale *locale,
|
||||||
|
|
||||||
#ifdef GIMP_HELP_DEBUG
|
#ifdef GIMP_HELP_DEBUG
|
||||||
g_printerr ("help (%s): parsing '%s' for locale \"%s\"\n",
|
g_printerr ("help (%s): parsing '%s' for locale \"%s\"\n",
|
||||||
locale->locale_id,
|
locale->locale_id, uri, help_domain);
|
||||||
filename,
|
|
||||||
help_domain);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
io = g_io_channel_new_file (filename, "r", error);
|
file = g_file_new_for_uri (uri);
|
||||||
if (! io)
|
|
||||||
|
stream = g_file_read (file, NULL, error);
|
||||||
|
|
||||||
|
if (! stream)
|
||||||
{
|
{
|
||||||
locale_set_error (error,
|
locale_set_error (error, _("Could not open '%s' for reading: %s"), file);
|
||||||
_("Could not open '%s' for reading: %s"),
|
g_object_unref (file);
|
||||||
filename);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.filename = filename;
|
parser.file = file;
|
||||||
parser.value = g_string_new (NULL);
|
parser.value = g_string_new (NULL);
|
||||||
parser.locale = locale;
|
parser.locale = locale;
|
||||||
parser.help_domain = help_domain;
|
parser.help_domain = help_domain;
|
||||||
|
@ -203,50 +206,45 @@ gimp_help_locale_parse (GimpHelpLocale *locale,
|
||||||
|
|
||||||
context = g_markup_parse_context_new (&markup_parser, 0, &parser, NULL);
|
context = g_markup_parse_context_new (&markup_parser, 0, &parser, NULL);
|
||||||
|
|
||||||
success = locale_parser_parse (context, io, error);
|
success = locale_parser_parse (context, G_INPUT_STREAM (stream), error);
|
||||||
|
|
||||||
g_markup_parse_context_free (context);
|
g_markup_parse_context_free (context);
|
||||||
g_io_channel_unref (io);
|
g_object_unref (stream);
|
||||||
|
|
||||||
g_string_free (parser.value, TRUE);
|
g_string_free (parser.value, TRUE);
|
||||||
g_free (parser.id_attr_name);
|
g_free (parser.id_attr_name);
|
||||||
|
|
||||||
if (! success)
|
if (! success)
|
||||||
locale_set_error (error, _("Parse error in '%s':\n%s"), filename);
|
locale_set_error (error, _("Parse error in '%s':\n%s"), file);
|
||||||
|
|
||||||
|
g_object_unref (file);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
locale_parser_parse (GMarkupParseContext *context,
|
locale_parser_parse (GMarkupParseContext *context,
|
||||||
GIOChannel *io,
|
GInputStream *stream,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
GIOStatus status;
|
gssize len;
|
||||||
gsize len;
|
|
||||||
gchar buffer[4096];
|
gchar buffer[4096];
|
||||||
|
|
||||||
while (TRUE)
|
while ((len = g_input_stream_read (stream, buffer, sizeof (buffer),
|
||||||
|
NULL, error)) != -1)
|
||||||
{
|
{
|
||||||
status = g_io_channel_read_chars (io,
|
switch (len)
|
||||||
buffer, sizeof (buffer), &len, error);
|
|
||||||
|
|
||||||
switch (status)
|
|
||||||
{
|
{
|
||||||
case G_IO_STATUS_ERROR:
|
case 0:
|
||||||
return FALSE;
|
|
||||||
case G_IO_STATUS_EOF:
|
|
||||||
return g_markup_parse_context_end_parse (context, error);
|
return g_markup_parse_context_end_parse (context, error);
|
||||||
case G_IO_STATUS_NORMAL:
|
|
||||||
|
default:
|
||||||
if (! g_markup_parse_context_parse (context, buffer, len, error))
|
if (! g_markup_parse_context_parse (context, buffer, len, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
|
||||||
case G_IO_STATUS_AGAIN:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -332,8 +330,11 @@ locale_parser_error (GMarkupParseContext *context,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
LocaleParser *parser = (LocaleParser *) user_data;
|
LocaleParser *parser = (LocaleParser *) user_data;
|
||||||
|
gchar *name = g_file_get_parse_name (parser->file);
|
||||||
|
|
||||||
g_printerr ("help (parsing %s): %s", parser->filename, error->message);
|
g_printerr ("help (parsing %s): %s", name, error->message);
|
||||||
|
|
||||||
|
g_free (name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -453,13 +454,14 @@ locale_parser_parse_missing (LocaleParser *parser,
|
||||||
static void
|
static void
|
||||||
locale_set_error (GError **error,
|
locale_set_error (GError **error,
|
||||||
const gchar *format,
|
const gchar *format,
|
||||||
const gchar *filename)
|
GFile *file)
|
||||||
{
|
{
|
||||||
if (error && *error)
|
if (error && *error)
|
||||||
{
|
{
|
||||||
gchar *name = g_filename_display_name (filename);
|
gchar *name = g_file_get_parse_name (file);
|
||||||
gchar *msg = g_strdup_printf (format, name, (*error)->message);
|
gchar *msg;
|
||||||
|
|
||||||
|
msg = g_strdup_printf (format, name, (*error)->message);
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
|
||||||
g_free ((*error)->message);
|
g_free ((*error)->message);
|
||||||
|
|
|
@ -43,7 +43,7 @@ const gchar * gimp_help_locale_map (GimpHelpLocale *locale,
|
||||||
const gchar *help_id);
|
const gchar *help_id);
|
||||||
|
|
||||||
gboolean gimp_help_locale_parse (GimpHelpLocale *locale,
|
gboolean gimp_help_locale_parse (GimpHelpLocale *locale,
|
||||||
const gchar *filename,
|
const gchar *uri,
|
||||||
const gchar *help_domain,
|
const gchar *help_domain,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue