virtual log4cxx_status_t decode(ByteBuffer& in, LogString& out) { const char* p = in.current(); size_t i = in.position(); #if !LOG4CXX_CHARSET_EBCDIC for (; i < in.limit() && ((unsigned int) *p) < 0x80; i++, p++) { out.append(1, *p); } in.position(i); #endif if (i < in.limit()) { Pool subpool; const char* enc = apr_os_locale_encoding(subpool.getAPRPool()); { synchronized sync(mutex); if (enc == 0) { if (decoder == 0) { encoding = "C"; decoder = new USASCIICharsetDecoder(); } } else if (encoding != enc) { encoding = enc; try { LogString e; Transcoder::decode(encoding, e); decoder = getDecoder(e); } catch (IllegalArgumentException& ex) { decoder = new USASCIICharsetDecoder(); } } } return decoder->decode(in, out); } return APR_SUCCESS; }
/* gets the current encoding of the system */ MVMString * MVM_proc_getencoding(MVMThreadContext *tc) { MVMString *result; apr_status_t rv; apr_pool_t *tmp_pool; char *encoding; /* need a temporary pool */ if ((rv = apr_pool_create(&tmp_pool, POOL(tc))) != APR_SUCCESS) { MVM_exception_throw_apr_error(tc, rv, "Failed to get encoding: "); } encoding = (char *)apr_os_locale_encoding(tmp_pool); result = MVM_string_utf8_decode(tc, tc->instance->VMString, encoding, strlen(encoding)); apr_pool_destroy(tmp_pool); return result; }
static apr_status_t get_page_id_from_name(UINT *page_id_p, const char *page_name, apr_pool_t *pool) { IMultiLanguage * mlang = NULL; HRESULT hr; MIMECSETINFO page_info; WCHAR ucs2_page_name[128]; if (page_name == SVN_APR_DEFAULT_CHARSET) { *page_id_p = CP_ACP; return APR_SUCCESS; } else if (page_name == SVN_APR_LOCALE_CHARSET) { OSVERSIONINFO ver_info; ver_info.dwOSVersionInfoSize = sizeof(ver_info); /* CP_THREAD_ACP supported only on Windows 2000 and later.*/ if (GetVersionEx(&ver_info) && ver_info.dwMajorVersion >= 5 && ver_info.dwPlatformId == VER_PLATFORM_WIN32_NT) { *page_id_p = CP_THREAD_ACP; return APR_SUCCESS; } /* CP_THREAD_ACP isn't supported on current system, so get locale encoding name from APR. */ page_name = apr_os_locale_encoding(pool); } else if (!strcmp(page_name, "UTF-8")) { *page_id_p = CP_UTF8; return APR_SUCCESS; } /* Use codepage identifier nnn if the codepage name is in the form of "CPnnn". We need this code since apr_os_locale_encoding() and svn_cmdline_init() generates such codepage names even if they are not valid IANA charset name. */ if ((page_name[0] == 'c' || page_name[0] == 'C') && (page_name[1] == 'p' || page_name[1] == 'P')) { *page_id_p = atoi(page_name + 2); return APR_SUCCESS; } hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, &IID_IMultiLanguage, (void **) &mlang); if (FAILED(hr)) return APR_EGENERAL; /* Convert page name to wide string. */ MultiByteToWideChar(CP_UTF8, 0, page_name, -1, ucs2_page_name, sizeof(ucs2_page_name) / sizeof(ucs2_page_name[0])); memset(&page_info, 0, sizeof(page_info)); hr = mlang->lpVtbl->GetCharsetInfo(mlang, ucs2_page_name, &page_info); if (FAILED(hr)) { mlang->lpVtbl->Release(mlang); return APR_EINVAL; } if (page_info.uiInternetEncoding) *page_id_p = page_info.uiInternetEncoding; else *page_id_p = page_info.uiCodePage; mlang->lpVtbl->Release(mlang); return APR_SUCCESS; }