diff options
author | Cody Chan <int64ago@gmail.com> | 2014-08-13 23:02:19 +0800 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2014-11-13 16:52:18 +0100 |
commit | 21b79679c1345225ceba8d015f5efe9113d146fb (patch) | |
tree | ec02275c629b38857f750cadd77113f970efdf14 /vdagent/file_xfer.cpp | |
parent | 6d1c038a8c8127206cfa17970a23ed6b3fe047cc (diff) |
Fix dragging of files with CJK characters in name
I submitted a patch several months ago about this issue,
here http://lists.freedesktop.org/archives/spice-devel/2014-February/016158.html
I check it again, and find that the value of
g_key_file_to_data(keyfile,...) is always utf-8, for the value of
g_uri_list_extract_uris() is utf8 urlencode.
So the display problem is caused by vd_agent, but how it displays
depends on the language of system, the following two screenshots show
the difference:
http://int64ago-tmp.qiniudn.com/guest-Chinese.png
http://int64ago-tmp.qiniudn.com/guest-English.png
Diffstat (limited to 'vdagent/file_xfer.cpp')
-rw-r--r-- | vdagent/file_xfer.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp index e402eb2..9eec5cc 100644 --- a/vdagent/file_xfer.cpp +++ b/vdagent/file_xfer.cpp @@ -46,6 +46,7 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, uint64_t file_size; HANDLE handle; AsUser as_user; + int wlen; status->id = start->id; status->result = VD_AGENT_FILE_XFER_STATUS_ERROR; @@ -81,7 +82,18 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start, strcat(file_path, "\\"); strcat(file_path, file_name); - handle = CreateFileA(file_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); + if((wlen = MultiByteToWideChar(CP_UTF8, 0, file_path, -1, NULL, 0)) == 0){ + vd_printf("failed getting WideChar length of %s", file_path); + return; + } + TCHAR *wfile_path = new TCHAR[wlen]; + if (MultiByteToWideChar(CP_UTF8, 0, file_path, -1, wfile_path, wlen) == 0){ + vd_printf("failed converting file_path:%s to WindChar", file_path); + delete[] wfile_path; + return; + } + handle = CreateFile(wfile_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); + delete[] wfile_path; if (handle == INVALID_HANDLE_VALUE) { vd_printf("failed creating %s %lu", file_path, GetLastError()); return; |