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.