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