Merge pull request #2673 from schellap/codecvt

Encode wide char to CP_ACP for CLR usage
This commit is contained in:
Senthil 2016-04-25 20:50:13 -07:00
commit 55e561bfb3
4 changed files with 76 additions and 57 deletions

View file

@ -67,39 +67,40 @@ int run(const arguments_t& args)
"FX_DEPS_FILE"
};
auto tpa_paths_cstr = pal::to_stdstring(probe_paths.tpa);
auto app_base_cstr = pal::to_stdstring(args.app_dir);
auto native_dirs_cstr = pal::to_stdstring(probe_paths.native);
auto resources_dirs_cstr = pal::to_stdstring(probe_paths.resources);
std::vector<char> tpa_paths_cstr, app_base_cstr, native_dirs_cstr, resources_dirs_cstr, fx_deps, deps;
pal::to_clrstring(probe_paths.tpa, &tpa_paths_cstr);
pal::to_clrstring(args.app_dir, &app_base_cstr);
pal::to_clrstring(probe_paths.native, &native_dirs_cstr);
pal::to_clrstring(probe_paths.resources, &resources_dirs_cstr);
std::string fx_deps = pal::to_stdstring(resolver.get_fx_deps_file());
std::string deps = pal::to_stdstring(resolver.get_deps_file() + _X(";")) + fx_deps;
pal::to_clrstring(resolver.get_fx_deps_file(), &fx_deps);
pal::to_clrstring(resolver.get_deps_file() + _X(";") + resolver.get_fx_deps_file(), &deps);
std::vector<const char*> property_values = {
// TRUSTED_PLATFORM_ASSEMBLIES
tpa_paths_cstr.c_str(),
tpa_paths_cstr.data(),
// APP_PATHS
app_base_cstr.c_str(),
app_base_cstr.data(),
// APP_NI_PATHS
app_base_cstr.c_str(),
app_base_cstr.data(),
// NATIVE_DLL_SEARCH_DIRECTORIES
native_dirs_cstr.c_str(),
native_dirs_cstr.data(),
// PLATFORM_RESOURCE_ROOTS
resources_dirs_cstr.c_str(),
resources_dirs_cstr.data(),
// AppDomainCompatSwitch
"UseLatestBehaviorWhenTFMNotSpecified",
// APP_CONTEXT_BASE_DIRECTORY
app_base_cstr.c_str(),
app_base_cstr.data(),
// APP_CONTEXT_DEPS_FILES,
deps.c_str(),
deps.data(),
// FX_DEPS_FILE
fx_deps.c_str()
fx_deps.data()
};
for (int i = 0; i < g_init.cfg_keys.size(); ++i)
{
property_keys.push_back(g_init.cfg_keys[i].c_str());
property_values.push_back(g_init.cfg_values[i].c_str());
property_keys.push_back(g_init.cfg_keys[i].data());
property_values.push_back(g_init.cfg_values[i].data());
}
size_t property_size = property_keys.size();
@ -121,20 +122,20 @@ int run(const arguments_t& args)
for (size_t i = 0; i < property_size; ++i)
{
pal::string_t key, val;
pal::to_palstring(property_keys[i], &key);
pal::to_palstring(property_values[i], &val);
pal::clr_palstring(property_keys[i], &key);
pal::clr_palstring(property_values[i], &val);
trace::verbose(_X("Property %s = %s"), key.c_str(), val.c_str());
}
}
std::string own_path;
pal::to_stdstring(args.own_path.c_str(), &own_path);
std::vector<char> own_path;
pal::to_clrstring(args.own_path, &own_path);
// Initialize CoreCLR
coreclr::host_handle_t host_handle;
coreclr::domain_id_t domain_id;
auto hr = coreclr::initialize(
own_path.c_str(),
own_path.data(),
"clrhost",
property_keys.data(),
property_values.data(),
@ -147,28 +148,31 @@ int run(const arguments_t& args)
return StatusCode::CoreClrInitFailure;
}
if (trace::is_enabled())
{
pal::string_t arg_str;
for (int i = 0; i < args.app_argc; i++)
{
arg_str.append(args.app_argv[i]);
arg_str.append(_X(","));
}
trace::info(_X("Launch host: %s app: %s, argc: %d args: %s"), args.own_path.c_str(),
args.managed_application.c_str(), args.app_argc, arg_str.c_str());
}
// Initialize with empty strings
std::vector<std::string> argv_strs(args.app_argc);
// Initialize clr strings for arguments
std::vector<std::vector<char>> argv_strs(args.app_argc);
std::vector<const char*> argv(args.app_argc);
for (int i = 0; i < args.app_argc; i++)
{
pal::to_stdstring(args.app_argv[i], &argv_strs[i]);
argv[i] = argv_strs[i].c_str();
pal::to_clrstring(args.app_argv[i], &argv_strs[i]);
argv[i] = argv_strs[i].data();
}
std::string managed_app = pal::to_stdstring(args.managed_application);
if (trace::is_enabled())
{
pal::string_t arg_str;
for (int i = 0; i < argv.size(); i++)
{
pal::string_t cur;
pal::clr_palstring(argv[i], &cur);
arg_str.append(cur);
arg_str.append(_X(","));
}
trace::info(_X("Launch host: %s, app: %s, argc: %d, args: %s"), args.own_path.c_str(),
args.managed_application.c_str(), args.app_argc, arg_str.c_str());
}
std::vector<char> managed_app;
pal::to_clrstring(args.managed_application, &managed_app);
// Leave breadcrumbs for servicing.
breadcrumb_writer_t writer(&breadcrumbs);
@ -181,7 +185,7 @@ int run(const arguments_t& args)
domain_id,
argv.size(),
argv.data(),
managed_app.c_str(),
managed_app.data(),
&exit_code);
if (!SUCCEEDED(hr))

View file

@ -170,8 +170,8 @@ private:
struct hostpolicy_init_t
{
std::vector<std::string> cfg_keys;
std::vector<std::string> cfg_values;
std::vector<std::vector<char>> cfg_keys;
std::vector<std::vector<char>> cfg_values;
pal::string_t deps_file;
std::vector<pal::string_t> probe_paths;
pal::string_t fx_dir;
@ -197,8 +197,8 @@ struct hostpolicy_init_t
}
trace::verbose(_X("Reading from host interface version: [0x%04x:%d] to initialize policy version: [0x%04x:%d]"), input->version_hi, input->version_lo, HOST_INTERFACE_LAYOUT_VERSION_HI, HOST_INTERFACE_LAYOUT_VERSION_LO);
make_stdstr_arr(input->config_keys.len, input->config_keys.arr, &init->cfg_keys);
make_stdstr_arr(input->config_values.len, input->config_values.arr, &init->cfg_values);
make_clrstr_arr(input->config_keys.len, input->config_keys.arr, &init->cfg_keys);
make_clrstr_arr(input->config_values.len, input->config_values.arr, &init->cfg_values);
init->fx_dir = input->fx_dir;
init->fx_name = input->fx_name;
@ -224,12 +224,12 @@ private:
}
}
static void make_stdstr_arr(int argc, const pal::char_t** argv, std::vector<std::string>* out)
static void make_clrstr_arr(int argc, const pal::char_t** argv, std::vector<std::vector<char>>* out)
{
out->reserve(argc);
out->resize(argc);
for (int i = 0; i < argc; ++i)
{
out->push_back(pal::to_stdstring(argv[i]));
pal::to_clrstring(pal::string_t(argv[i]), &(*out)[i]);
}
}
};

View file

@ -118,9 +118,9 @@ namespace pal
inline void err_vprintf(const char_t* format, va_list vl) { ::vfwprintf(stderr, format, vl); ::fputws(_X("\r\n"), stderr); }
pal::string_t to_palstring(const std::string& str);
std::string to_stdstring(const pal::string_t& str);
void to_palstring(const char* str, pal::string_t* out);
void to_stdstring(const pal::char_t* str, std::string* out);
void to_clrstring(const pal::string_t& str, std::vector<char>* out);
void clr_palstring(const char* out, pal::string_t* str);
#else
#ifdef COREHOST_MAKE_DLL
#define SHARED_API extern "C"
@ -160,9 +160,9 @@ namespace pal
inline size_t strlen(const char_t* str) { return ::strlen(str); }
inline void err_vprintf(const char_t* format, va_list vl) { ::vfprintf(stderr, format, vl); ::fputc('\n', stderr); }
inline pal::string_t to_palstring(const std::string& str) { return str; }
inline std::string to_stdstring(const pal::string_t& str) { return str; }
inline void to_palstring(const char* str, pal::string_t* out) { out->assign(str); }
inline void to_stdstring(const char_t* str, std::string* out) { out->assign(str); }
inline void to_clrstring(const pal::string_t& str, std::vector<char>* out) { out->assign(str.begin(), str.end()); out->push_back('\0'); }
inline void clr_palstring(const char* clr, pal::string_t* str) { str->assign(clr); }
#endif
bool touch_file(const pal::string_t& path);

View file

@ -253,11 +253,6 @@ bool pal::get_own_executable_path(string_t* recv)
return true;
}
std::string pal::to_stdstring(const string_t& str)
{
return t_converter.to_bytes(str);
}
pal::string_t pal::to_palstring(const std::string& str)
{
return t_converter.from_bytes(str);
@ -268,9 +263,29 @@ void pal::to_palstring(const char* str, pal::string_t* out)
out->assign(t_converter.from_bytes(str));
}
void pal::to_stdstring(const pal::char_t* str, std::string* out)
void pal::to_clrstring(const pal::string_t& str, std::vector<char>* out)
{
out->assign(t_converter.to_bytes(str));
// Pass -1 as we want explicit null termination in the char buffer.
size_t size = ::WideCharToMultiByte(CP_ACP, 0, str.c_str(), -1, nullptr, 0, nullptr, nullptr);
out->resize(size, '\0');
if (size == 0)
{
return;
}
::WideCharToMultiByte(CP_ACP, 0, str.c_str(), -1, out->data(), out->size(), nullptr, nullptr);
}
void pal::clr_palstring(const char* out, pal::string_t* str)
{
// No need of explicit null termination, so pass in the actual length.
int len = ::strlen(out);
size_t size = ::MultiByteToWideChar(CP_ACP, 0, out, len, nullptr, 0);
str->resize(size, '\0');
if (size == 0)
{
return;
}
::MultiByteToWideChar(CP_ACP, 0, out, len, &(*str)[0], str->size());
}
bool pal::realpath(string_t* path)