| 374 | | return xmlrpc_string_new(env, object.as_string().c_str()); |
| | 374 | { |
| | 375 | #ifdef XMLRPC_HAVE_I8 |
| | 376 | // The versions that support I8 do implicit utf-8 validation. |
| | 377 | xmlrpc_value* result = xmlrpc_string_new(env, object.as_string().c_str()); |
| | 378 | #else |
| | 379 | // In older versions, xmlrpc-c doesn't validate the utf-8 encoding itself. |
| | 380 | xmlrpc_validate_utf8(env, object.as_string().c_str(), object.as_string().length()); |
| | 381 | |
| | 382 | xmlrpc_value* result = env->fault_occurred ? NULL : xmlrpc_string_new(env, object.as_string().c_str()); |
| | 383 | #endif |
| | 384 | |
| | 385 | if (env->fault_occurred) { |
| | 386 | xmlrpc_env_clean(env); |
| | 387 | xmlrpc_env_init(env); |
| | 388 | |
| | 389 | const std::string& str = object.as_string(); |
| | 390 | char buffer[str.size() + 1]; |
| | 391 | char* dst = buffer; |
| | 392 | for (std::string::const_iterator itr = str.begin(); itr != str.end(); ++itr) |
| | 393 | *dst++ = ((*itr < 0x20 && *itr != '\r' && *itr != '\n' && *itr != '\t') || (*itr & 0x80)) ? '?' : *itr; |
| | 394 | *dst = 0; |
| | 395 | |
| | 396 | result = xmlrpc_string_new(env, buffer); |
| | 397 | } |
| | 398 | |
| | 399 | return result; |
| | 400 | } |