On Fri, Mar 4, 2011 at 02:24, Adelle Hartley ade...@akemi.com.au wrote:
This is a helper class I wrote for the module I'm working on. It assumes
the native wide encoding is UTF-32. To make it cross platform, you'd have
to check what the correct wide encoding is.
This is my first apache module, so any corrections welcome.
class our_response_t
{
protected:
request_rec* m;
apr_xlate_t* m_convset;
char m_bufferBytes[CHARSET_CONVERSION_BUFFER_SIZE];
public:
our_response_t(request_rec* request) : m(request), m_convset(NULL),
m_html(NULL), m_json(NULL)
{
apr_pool_t* pool = m-pool;
apr_status_t status = apr_xlate_open(m_convset, UTF-8,
UTF-32, pool);
if (m_convset)
{
ap_set_content_type(m, text/html;charset=UTF-8);
}
}
~our_response_t()
{
if (m_convset)
{
apr_xlate_close(m_convset);
}
}
void append_chars(const wchar_t* str, size_t num_chars)
{
apr_size_t inbytes_left = num_chars*sizeof(wchar_t);
apr_size_t outbytes_left = CHARSET_CONVERSION_BUFFER_SIZE-1;
apr_status_t status = apr_xlate_conv_buffer(m_convset, (const
char*)str, inbytes_left, m_bufferBytes, outbytes_left);
m_bufferBytes[CHARSET_CONVERSION_BUFFER_SIZE-outbytes_left-1]
= 0;
ap_rputs(m_bufferBytes, m);
}
};
Adelle, your code doesn't appear to be handling errors. A number of
things can go wrong here:
1. The conversion may not be supported.
2. Partial character sequences (not an issue here since the input is
UTF-32 but I mention it for posterity's sake), reported as
APR_EINCOMPLETE.
3. Illegal character sequences, reported as APR_EINVAL.
4. Output buffer too short. Reported as APR_SUCCESS but with inbytes_left 0.