• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8006 (tree)
Zeit2019-08-22 12:37:11
Autordoda

Log Message

リモートからのクリップボード読み取りの Unicode 対応

ASCII 以外の文字が含まれている場合、送信漢字コード設定が UTF-8 以外だと期待通り動かないかも。

Ändern Zusammenfassung

Diff

--- branches/unicode_buf/teraterm/teraterm/clipboar.c (revision 8005)
+++ branches/unicode_buf/teraterm/teraterm/clipboar.c (revision 8006)
@@ -43,6 +43,7 @@
4343 #include "ttcommon.h"
4444 #include "ttlib.h"
4545 #include "dlglib.h"
46+#include "codeconv.h"
4647
4748 #include "clipboar.h"
4849 #include "tt_res.h"
@@ -980,6 +981,98 @@
980981 }
981982 }
982983
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+
9831076 // この関数はクリップボードおよびDDEデータを端末へ送り込む。
9841077 //
9851078 // CBMemHandleハンドルはグローバル変数なので、この関数が終了するまでは、
--- branches/unicode_buf/teraterm/teraterm/clipboar.h (revision 8005)
+++ branches/unicode_buf/teraterm/teraterm/clipboar.h (revision 8006)
@@ -47,6 +47,7 @@
4747 void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed);
4848 void CBStartPasteW(HWND HWin, BOOL AddCR, BOOL Bracketed);
4949 void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer);
50+void CBStartPasteB64W(HWND HWin, PCHAR header, PCHAR footer);
5051 void CBSend(void);
5152 void CBSendW(void);
5253 void CBEcho(void);
--- branches/unicode_buf/teraterm/teraterm/vtterm.c (revision 8005)
+++ branches/unicode_buf/teraterm/teraterm/vtterm.c (revision 8006)
@@ -4839,7 +4839,11 @@
48394839 }
48404840 strncpy_s(hdr, sizeof(hdr), "\033]52;", _TRUNCATE);
48414841 if (strncat_s(hdr, sizeof(hdr), buff, p - buff) == 0) {
4842+#if UNICODE_INTERNAL_BUFF
4843+ CBStartPasteB64W(HVTWin, hdr, "\033\\");
4844+#else
48424845 CBStartPasteB64(HVTWin, hdr, "\033\\");
4846+#endif
48434847 }
48444848 }
48454849 else if (ts.NotifyClipboardAccess) {
Show on old repository browser