[Ttssh2-commit] [4769] OSC 52 のクリップボード読み込みに対応

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2011年 12月 6日 (火) 19:01:20 JST


Revision: 4769
          http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4769
Author:   doda
Date:     2011-12-06 19:01:20 +0900 (Tue, 06 Dec 2011)
Log Message:
-----------
OSC 52 のクリップボード読み込みに対応

Modified Paths:
--------------
    trunk/teraterm/common/ttlib.c
    trunk/teraterm/common/ttlib.h
    trunk/teraterm/teraterm/clipboar.c
    trunk/teraterm/teraterm/clipboar.h
    trunk/teraterm/teraterm/vtterm.c

-------------- next part --------------
Modified: trunk/teraterm/common/ttlib.c
===================================================================
--- trunk/teraterm/common/ttlib.c	2011-12-06 08:17:56 UTC (rev 4768)
+++ trunk/teraterm/common/ttlib.c	2011-12-06 10:01:20 UTC (rev 4769)
@@ -16,7 +16,7 @@
 #include <mbctype.h>
 
 // for b64encode/b64decode
-// static char *b64enc_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static char *b64enc_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 static char b64dec_table[] = {
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
@@ -36,10 +36,60 @@
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-// void b64encode(PCHAR dst, int dsize, PCHAR src, int len)
-// {
-// }
+void b64encode(PCHAR d, int dsize, PCHAR s, int len)
+{
+	unsigned int b = 0;
+	int state = 0;
+	unsigned char *src, *dst;
 
+	src = (unsigned char *)s;
+	dst = (unsigned char *)d;
+
+	if (dsize == 0 || dst == NULL || src == NULL) {
+		return;
+	}
+	if (dsize < 5) {
+		*dst = 0;
+		return;
+	}
+
+	while (len > 0) {
+		b = (b << 8) | *src++;
+		len--;
+		state++;
+
+		if (state == 3) {
+			*dst++ = b64enc_table[(b>>18) & 0x3f];
+			*dst++ = b64enc_table[(b>>12) & 0x3f];
+			*dst++ = b64enc_table[(b>>6) & 0x3f];
+			*dst++ = b64enc_table[b & 0x3f];
+			dsize -= 4;
+			state = 0;
+			b = 0;
+			if (dsize < 5)
+				break;
+		}
+	}
+
+	if (dsize >= 5) {
+		if (state == 1) {
+			*dst++ = b64enc_table[(b>>2) & 0x3f];
+			*dst++ = b64enc_table[(b<<4) & 0x3f];
+			*dst++ = '=';
+			*dst++ = '=';
+		}
+		else if (state == 2) {
+			*dst++ = b64enc_table[(b>>10) & 0x3f];
+			*dst++ = b64enc_table[(b>>4) & 0x3f];
+			*dst++ = b64enc_table[(b<<2) & 0x3f];
+			*dst++ = '=';
+		}
+	}
+
+	*dst = 0;
+	return;
+}
+
 int b64decode(PCHAR dst, int dsize, PCHAR src)
 {
 	unsigned int b = 0;

Modified: trunk/teraterm/common/ttlib.h
===================================================================
--- trunk/teraterm/common/ttlib.h	2011-12-06 08:17:56 UTC (rev 4768)
+++ trunk/teraterm/common/ttlib.h	2011-12-06 10:01:20 UTC (rev 4769)
@@ -48,7 +48,7 @@
 int KanjiCodeTranslate(int lang, int kcode);
 char *mctimelocal();
 
-// void b64encode(PCHAR dst, int dsize, PCHAR src, int len);
+void b64encode(PCHAR dst, int dsize, PCHAR src, int len);
 int b64decode(PCHAR dst, int dsize, PCHAR src);
 
 #ifdef __cplusplus

Modified: trunk/teraterm/teraterm/clipboar.c
===================================================================
--- trunk/teraterm/teraterm/clipboar.c	2011-12-06 08:17:56 UTC (rev 4768)
+++ trunk/teraterm/teraterm/clipboar.c	2011-12-06 10:01:20 UTC (rev 4769)
@@ -13,6 +13,7 @@
 
 #include "ttwinman.h"
 #include "ttcommon.h"
+#include "ttlib.h"
 
 #include "clipboar.h"
 #include "tt_res.h"
@@ -156,6 +157,70 @@
 	}
 }
 
+void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer)
+{
+	HANDLE tmpHandle = NULL;
+	char *tmpPtr = NULL;
+	int len, hlen, flen, blen;
+
+	if (! cv.Ready) {
+		return;
+	}
+	if (TalkStatus!=IdTalkKeyb) {
+		return;
+	}
+
+	CBEchoOnly = FALSE;
+
+	CBMemHandle = NULL;
+	CBMemPtr = NULL;
+	CBMemPtr2 = 0;
+	CBDDE = TRUE;
+
+	if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(HWin)) {
+		if ((tmpHandle = GetClipboardData(CF_TEXT)) == NULL) {
+			CloseClipboard();
+		}
+	}
+	else if (IsClipboardFormatAvailable(CF_OEMTEXT) && OpenClipboard(HWin)) {
+		if ((tmpHandle = GetClipboardData(CF_OEMTEXT)) == NULL) {
+			CloseClipboard();
+		}
+	}
+
+	if (tmpHandle) {
+		if ((tmpPtr = GlobalLock(tmpHandle)) != NULL) {
+			hlen = strlen(header);
+			flen = strlen(footer);
+			len = strlen(tmpPtr);
+			blen = (len + 2) / 3 * 4 + hlen + flen + 1;
+			if ((CBMemHandle = GlobalAlloc(GHND, blen)) != NULL) {
+				if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
+					if (hlen > 0) {
+						strncpy_s(CBMemPtr, blen, header, _TRUNCATE);
+					}
+					b64encode(CBMemPtr + hlen, blen - hlen, tmpPtr, len);
+					if (flen > 0) {
+						strncat_s(CBMemPtr, blen, footer, _TRUNCATE);
+					}
+					TalkStatus=IdTalkCB;
+					GlobalUnlock(CBMemPtr);
+					CBMemPtr = NULL;
+				}
+			}
+			GlobalUnlock(tmpPtr);
+		}
+		CloseClipboard();
+	}
+
+	CBRetrySend = FALSE;
+	CBRetryEcho = FALSE;
+	CBSendCR = FALSE;
+	if (TalkStatus != IdTalkCB) {
+		CBEndPaste();
+	}
+}
+
 void CBStartEcho(PCHAR DataPtr, int DataSize)
 {
 	if (! cv.Ready) {
@@ -170,9 +235,8 @@
 	CBRetryEcho = FALSE;
 	CBSendCR = FALSE;
 
-	CBDDE = FALSE;
+	CBDDE = TRUE;
 	if ((CBMemHandle = GlobalAlloc(GHND, DataSize)) != NULL) {
-		CBDDE = TRUE;
 		if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
 			memcpy(CBMemPtr, DataPtr, DataSize);
 			GlobalUnlock(CBMemHandle);

Modified: trunk/teraterm/teraterm/clipboar.h
===================================================================
--- trunk/teraterm/teraterm/clipboar.h	2011-12-06 08:17:56 UTC (rev 4768)
+++ trunk/teraterm/teraterm/clipboar.h	2011-12-06 10:01:20 UTC (rev 4769)
@@ -13,6 +13,7 @@
 void CBClose();
 void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed,
 		  int BuffSize, PCHAR DataPtr, int DataSize);
+void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer);
 void CBStartEcho(PCHAR DataPtr, int DataSize);
 void CBSend();
 void CBEcho();

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2011-12-06 08:17:56 UTC (rev 4768)
+++ trunk/teraterm/teraterm/vtterm.c	2011-12-06 10:01:20 UTC (rev 4769)
@@ -24,6 +24,7 @@
 #include "teraprn.h"
 #include "telnet.h"
 #include "ttime.h"
+#include "clipboar.h"
 
 #include "vtterm.h"
 
@@ -3447,7 +3448,7 @@
 void XsProcClipboard(PCHAR buff)
 {
 	int len, blen;
-	char *p, *cbbuff;
+	char *p, *cbbuff, hdr[20];
 	HGLOBAL cbmem;
 
 	p = buff;
@@ -3458,7 +3459,10 @@
 	if (*p++ == ';') {
 		if (*p == '?' && *(p+1) == 0) { // Read access
 			if (ts.CtrlFlag & CSF_CBREAD) {
-				; // not supported.
+				strncpy_s(hdr, sizeof(hdr), "\033]52;", _TRUNCATE);
+				if (strncat_s(hdr, sizeof(hdr), buff, p - buff) == 0) {
+					CBStartPasteB64(HVTWin, hdr, "\033\\");
+				}
 			}
 		}
 		else if (ts.CtrlFlag & CSF_CBWRITE) { // Write access



Ttssh2-commit メーリングリストの案内
アーカイブの一覧に戻る