From 039bf2e7e5b8e0a35867b6f00641a351a95d4fbc Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Tue, 6 Jan 2009 16:57:35 +0000 Subject: Correct return value when we can't find a charset in inputstream constructor. Add new API to enable on-the-fly changing of the input charset. This is only possible if no data has been read from the stream. svn path=/trunk/libparserutils/; revision=5969 --- src/input/inputstream.c | 76 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 14 deletions(-) (limited to 'src/input') diff --git a/src/input/inputstream.c b/src/input/inputstream.c index f678e66..1bc40c5 100644 --- a/src/input/inputstream.c +++ b/src/input/inputstream.c @@ -107,22 +107,23 @@ parserutils_error parserutils_inputstream_create(const char *enc, s->mibenum = parserutils_charset_mibenum_from_name(enc, strlen(enc)); - if (s->mibenum != 0) { - params.encoding.name = enc; - - error = parserutils_filter_setopt(s->input, - PARSERUTILS_FILTER_SET_ENCODING, - ¶ms); - if (error != PARSERUTILS_OK) { - parserutils_filter_destroy(s->input); - parserutils_buffer_destroy(s->public.utf8); - parserutils_buffer_destroy(s->raw); - alloc(s, 0, pw); - return error; - } + if (s->mibenum == 0) + return PARSERUTILS_BADENCODING; + + params.encoding.name = enc; - s->encsrc = encsrc; + error = parserutils_filter_setopt(s->input, + PARSERUTILS_FILTER_SET_ENCODING, + ¶ms); + if (error != PARSERUTILS_OK) { + parserutils_filter_destroy(s->input); + parserutils_buffer_destroy(s->public.utf8); + parserutils_buffer_destroy(s->raw); + alloc(s, 0, pw); + return error; } + + s->encsrc = encsrc; } else { s->mibenum = 0; s->encsrc = 0; @@ -308,6 +309,53 @@ const char *parserutils_inputstream_read_charset( return parserutils_charset_mibenum_to_name(s->mibenum); } +/** + * Change the source charset of the input stream + * + * \param stream Input stream to modify + * \param charset Charset name + * \param source Charset source identifier + * \return PARSERUTILS_OK on success, + * PARSERUTILS_BADPARM on invalid parameters, + * PARSERUTILS_INVALID if called after data has been read from stream, + * PARSERUTILS_BADENCODING if the encoding is unsupported, + * PARSERUTILS_NOMEM on memory exhaustion. + */ +parserutils_error parserutils_inputstream_change_charset( + parserutils_inputstream *stream, + const char *enc, uint32_t source) +{ + parserutils_inputstream_private *s = + (parserutils_inputstream_private *) stream; + parserutils_filter_optparams params; + uint16_t temp; + parserutils_error error; + + if (stream == NULL || enc == NULL) + return PARSERUTILS_BADPARM; + + if (s->done_first_chunk) + return PARSERUTILS_INVALID; + + temp = parserutils_charset_mibenum_from_name(enc, strlen(enc)); + if (temp == 0) + return PARSERUTILS_BADENCODING; + + /* Ensure filter is using the correct encoding */ + params.encoding.name = enc; + error = parserutils_filter_setopt(s->input, + PARSERUTILS_FILTER_SET_ENCODING, + ¶ms); + if (error != PARSERUTILS_OK) + return error; + + /* Finally, replace the current settings */ + s->mibenum = temp; + s->encsrc = source; + + return PARSERUTILS_OK; +} + /****************************************************************************** ******************************************************************************/ -- cgit v1.2.3