リモートからのクリップボード読み取りの Unicode 対応
ASCII 以外の文字が含まれている場合、送信漢字コード設定が UTF-8 以外だと期待通り動かないかも。
@@ -43,6 +43,7 @@ | ||
43 | 43 | #include "ttcommon.h" |
44 | 44 | #include "ttlib.h" |
45 | 45 | #include "dlglib.h" |
46 | +#include "codeconv.h" | |
46 | 47 | |
47 | 48 | #include "clipboar.h" |
48 | 49 | #include "tt_res.h" |
@@ -980,6 +981,98 @@ | ||
980 | 981 | } |
981 | 982 | } |
982 | 983 | |
984 | +void CBStartPasteB64W(HWND HWin, PCHAR header, PCHAR footer) | |
985 | +{ | |
986 | + size_t mb_len, b64_len, header_len = 0, footer_len = 0; | |
987 | + clipboard_work_t *p; | |
988 | + wchar_t *str_w = NULL; | |
989 | + char *str_mb = NULL; | |
990 | + char *str_b64 = NULL; | |
991 | + | |
992 | + if (! cv.Ready) { | |
993 | + return; | |
994 | + } | |
995 | + if (TalkStatus!=IdTalkKeyb) { | |
996 | + return; | |
997 | + } | |
998 | + | |
999 | + CBEchoOnly = FALSE; | |
1000 | + | |
1001 | + p = &cbwork; | |
1002 | + if (p->send_str != NULL) { | |
1003 | + // 送信中? | |
1004 | + return; | |
1005 | + } | |
1006 | + | |
1007 | + str_w = GetClipboardTextW(HWin, FALSE); | |
1008 | + if (str_w == NULL) { | |
1009 | + // クリップボードから文字列を取得できなかった | |
1010 | + goto error; | |
1011 | + return; | |
1012 | + } | |
1013 | + p->send_str = str_w; | |
1014 | + | |
1015 | + if (ts.Language == IdUtf8 || ts.KanjiCodeSend == IdUTF8) { | |
1016 | + str_mb = ToU8W(str_w); | |
1017 | + } | |
1018 | + else { | |
1019 | + str_mb = ToCharW(str_w); | |
1020 | + } | |
1021 | + | |
1022 | + if (str_mb == NULL) { | |
1023 | + goto error; | |
1024 | + } | |
1025 | + | |
1026 | + if (header != NULL) { | |
1027 | + header_len = strlen(header); | |
1028 | + } | |
1029 | + if (footer != NULL) { | |
1030 | + footer_len = strlen(footer); | |
1031 | + } | |
1032 | + | |
1033 | + mb_len = strlen(str_mb); | |
1034 | + b64_len = (mb_len + 2) / 3 * 4 + header_len + footer_len + 1; | |
1035 | + | |
1036 | + if ((str_b64 = malloc(b64_len)) == NULL) {; | |
1037 | + goto error; | |
1038 | + } | |
1039 | + | |
1040 | + if (header_len > 0) { | |
1041 | + strncpy_s(str_b64, b64_len, header, _TRUNCATE); | |
1042 | + } | |
1043 | + | |
1044 | + b64encode(str_b64 + header_len, b64_len - header_len, str_mb, mb_len); | |
1045 | + | |
1046 | + if (footer_len > 0) { | |
1047 | + strncat_s(str_b64, b64_len, footer, _TRUNCATE); | |
1048 | + } | |
1049 | + | |
1050 | + free(str_w); | |
1051 | + if ((str_w = ToWcharA(str_b64)) == NULL) { | |
1052 | + goto error; | |
1053 | + } | |
1054 | + | |
1055 | + free(str_mb); | |
1056 | + free(str_b64); | |
1057 | + | |
1058 | + // 貼り付けの準備が正常に出来た | |
1059 | + p->send_str = str_w; | |
1060 | + p->send_index = 0; | |
1061 | + p->waited = FALSE; | |
1062 | + p->str_len = wcslen(p->send_str); | |
1063 | + p->send_left = p->str_len; | |
1064 | + TalkStatus = IdTalkCB; | |
1065 | + | |
1066 | + return; | |
1067 | + | |
1068 | +error: | |
1069 | + free(str_w); | |
1070 | + free(str_mb); | |
1071 | + free(str_b64); | |
1072 | + CBEndPaste(); | |
1073 | + return; | |
1074 | +} | |
1075 | + | |
983 | 1076 | // この関数はクリップボードおよびDDEデータを端末へ送り込む。 |
984 | 1077 | // |
985 | 1078 | // CBMemHandleハンドルはグローバル変数なので、この関数が終了するまでは、 |
@@ -47,6 +47,7 @@ | ||
47 | 47 | void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed); |
48 | 48 | void CBStartPasteW(HWND HWin, BOOL AddCR, BOOL Bracketed); |
49 | 49 | void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer); |
50 | +void CBStartPasteB64W(HWND HWin, PCHAR header, PCHAR footer); | |
50 | 51 | void CBSend(void); |
51 | 52 | void CBSendW(void); |
52 | 53 | void CBEcho(void); |
@@ -4839,7 +4839,11 @@ | ||
4839 | 4839 | } |
4840 | 4840 | strncpy_s(hdr, sizeof(hdr), "\033]52;", _TRUNCATE); |
4841 | 4841 | if (strncat_s(hdr, sizeof(hdr), buff, p - buff) == 0) { |
4842 | +#if UNICODE_INTERNAL_BUFF | |
4843 | + CBStartPasteB64W(HVTWin, hdr, "\033\\"); | |
4844 | +#else | |
4842 | 4845 | CBStartPasteB64(HVTWin, hdr, "\033\\"); |
4846 | +#endif | |
4843 | 4847 | } |
4844 | 4848 | } |
4845 | 4849 | else if (ts.NotifyClipboardAccess) { |