[Ttssh2-commit] [6440] ・CBStartPaste () を DDE 系とクリップボード系に分離

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2016年 7月 12日 (火) 18:04:21 JST


Revision: 6440
          http://sourceforge.jp/projects/ttssh2/scm/svn/commits/6440
Author:   doda
Date:     2016-07-12 18:04:20 +0900 (Tue, 12 Jul 2016)
Log Message:
-----------
・CBStartPaste() を DDE 系とクリップボード系に分離
・DDE系の CBStartSend() と CBStartEcho() を共通化
・コメントで DataSize should be <= BuffSize とあるが実際には保証されてなく、
  ヒープを破壊する事があった事(*1)、および BuffSize を呼び出し元から指定する
  意味も無さそうなので BuffSize を廃止し、メモリの確保にも DataSize を
  使うように変更。

[*1] BuffSize は TermWidthMax(500) だが、DataSize は MaxStrLen(512) まで
     大きくなる為、500バイト以上のデータを send するとバッファオーバランで
     ヒープが壊れる

Modified Paths:
--------------
    trunk/teraterm/teraterm/clipboar.c
    trunk/teraterm/teraterm/clipboar.h
    trunk/teraterm/teraterm/tekwin.cpp
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/teraterm/vtwin.cpp

-------------- next part --------------
Modified: trunk/teraterm/teraterm/clipboar.c
===================================================================
--- trunk/teraterm/teraterm/clipboar.c	2016-07-11 08:53:16 UTC (rev 6439)
+++ trunk/teraterm/teraterm/clipboar.c	2016-07-12 09:04:20 UTC (rev 6440)
@@ -108,13 +108,49 @@
 	CBCopyWideHandle = NULL;
 }
 
-void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed,
-                  int BuffSize, PCHAR DataPtr, int DataSize)
-//
-//  DataPtr and DataSize are used only for DDE
-//	  For clipboard, BuffSize should be 0
-//	  DataSize should be <= BuffSize
+void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly)
 {
+	if (! cv.Ready) {
+		return;
+	}
+	if (TalkStatus!=IdTalkKeyb) {
+		return;
+	}
+
+	CBAddCR = FALSE;
+	CBBracketed = CB_BRACKET_NONE;
+
+	CBEchoOnly = EchoOnly;
+
+	CBMemHandle = NULL;
+	CBMemPtr = NULL;
+
+	CBMemPtr2 = 0;
+	CBDDE = TRUE;
+	CBWIDE = FALSE;
+
+	CBInsertDelay = FALSE;
+
+	CBRetrySend = FALSE;
+	CBRetryEcho = FALSE;
+	CBSendCR = FALSE;
+
+	if ((CBMemHandle = GlobalAlloc(GHND, DataSize)) != NULL) {
+		if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
+			memcpy(CBMemPtr, DataPtr, DataSize);
+			GlobalUnlock(CBMemHandle);
+			CBMemPtr=NULL;
+			TalkStatus=IdTalkCB;
+		}
+	}
+
+	if (TalkStatus != IdTalkCB) {
+		CBEndPaste();
+	}
+}
+
+void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed)
+{
 	UINT Cf;
 
 	if (! cv.Ready) {
@@ -129,20 +165,18 @@
 		CBBracketed = CB_BRACKET_START;
 	}
 
-	if (BuffSize==0) { // for clipboar
-		if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
-			Cf = CF_UNICODETEXT;
-		}
-		else if (IsClipboardFormatAvailable(CF_TEXT)) {
-			Cf = CF_TEXT;
-		}
-		else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
-			Cf = CF_OEMTEXT;
-		}
-		else {
-			return;
-		}
+	if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
+		Cf = CF_UNICODETEXT;
 	}
+	else if (IsClipboardFormatAvailable(CF_TEXT)) {
+		Cf = CF_TEXT;
+	}
+	else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
+		Cf = CF_OEMTEXT;
+	}
+	else {
+		return;
+	}
 
 	CBEchoOnly = FALSE;
 
@@ -153,59 +187,46 @@
 	CBWIDE = FALSE;
 	CBInsertDelay = FALSE;
 
-	if (BuffSize==0) { //clipboard
-		if (ts.PasteDelayPerLine > 0) {
-			CBInsertDelay = TRUE;
-		}
-		if (OpenClipboard(HWin)) {
-			if (Cf == CF_UNICODETEXT) {
-				// \x93\\x82\xE8\x95t\x82\xAF\x8F\x88\x97\x9D\x82ł\xCD CBMemHandle \x82ł͂Ȃ\xAD dde \x82Ɠ\xAF\x82\xB6\x82悤\x82\xC9 CBMemPtr \x82\xAA\x8Eg\x82\xED\x82\xEA\x82\xE9
-				HGLOBAL TmpHandle = GetClipboardData(Cf);
-				CBWIDE = TRUE;
-				if (TmpHandle) {
-					LPWSTR TmpPtr = (LPWSTR)GlobalLock(TmpHandle);
-					int mb_len = WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, 0, 0, NULL, NULL);
+	CBRetrySend = FALSE;
+	CBRetryEcho = FALSE;
+	CBSendCR = FALSE;
 
-					CBMemHandle = GlobalAlloc(GHND, mb_len);
-					if (CBMemHandle != NULL) {
-						CBMemPtr = GlobalLock(CBMemHandle);
-						if (CBMemPtr != NULL) {
-							WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, CBMemPtr, mb_len, NULL, NULL);
+	if (ts.PasteDelayPerLine > 0) {
+		CBInsertDelay = TRUE;
+	}
+	if (OpenClipboard(HWin)) {
+		if (Cf == CF_UNICODETEXT) {
+			// \x93\\x82\xE8\x95t\x82\xAF\x8F\x88\x97\x9D\x82ł\xCD CBMemHandle \x82ł͂Ȃ\xAD dde \x82Ɠ\xAF\x82\xB6\x82悤\x82\xC9 CBMemPtr \x82\xAA\x8Eg\x82\xED\x82\xEA\x82\xE9
+			HGLOBAL TmpHandle = GetClipboardData(Cf);
+			CBWIDE = TRUE;
+			if (TmpHandle) {
+				LPWSTR TmpPtr = (LPWSTR)GlobalLock(TmpHandle);
+				int mb_len = WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, 0, 0, NULL, NULL);
 
-							GlobalUnlock(CBMemHandle);
-							CBMemPtr=NULL;
-							TalkStatus=IdTalkCB;
-						}
+				CBMemHandle = GlobalAlloc(GHND, mb_len);
+				if (CBMemHandle != NULL) {
+					CBMemPtr = GlobalLock(CBMemHandle);
+					if (CBMemPtr != NULL) {
+						WideCharToMultiByte(CP_ACP, 0, TmpPtr, -1, CBMemPtr, mb_len, NULL, NULL);
 
-						GlobalUnlock(TmpHandle);
-						CloseClipboard();
+						GlobalUnlock(CBMemHandle);
+						CBMemPtr=NULL;
+						TalkStatus=IdTalkCB;
 					}
+
+					GlobalUnlock(TmpHandle);
+					CloseClipboard();
 				}
 			}
-			else {
-				CBMemHandle = GetClipboardData(Cf);
-				if (CBMemHandle!=NULL) {
-					TalkStatus=IdTalkCB;
-				}
-			}
 		}
-	}
-	else { // dde
-		CBMemHandle = GlobalAlloc(GHND,BuffSize);
-		if (CBMemHandle != NULL) {
-			CBDDE = TRUE;
-			CBMemPtr = GlobalLock(CBMemHandle);
-			if (CBMemPtr != NULL) {
-				memcpy(CBMemPtr,DataPtr,DataSize);
-				GlobalUnlock(CBMemHandle);
-				CBMemPtr=NULL;
+		else {
+			CBMemHandle = GetClipboardData(Cf);
+			if (CBMemHandle!=NULL) {
 				TalkStatus=IdTalkCB;
 			}
 		}
 	}
-	CBRetrySend = FALSE;
-	CBRetryEcho = FALSE;
-	CBSendCR = FALSE;
+
 	if (TalkStatus != IdTalkCB) {
 		CBEndPaste();
 	}
@@ -325,36 +346,6 @@
 	}
 }
 
-void CBStartEcho(PCHAR DataPtr, int DataSize)
-{
-	if (! cv.Ready) {
-		return;
-	}
-	if (TalkStatus!=IdTalkKeyb) {
-		return;
-	}
-
-	CBEchoOnly = TRUE;
-	CBMemPtr2 = 0;
-	CBRetryEcho = FALSE;
-	CBSendCR = FALSE;
-	CBWIDE = FALSE;
-
-	CBDDE = TRUE;
-	if ((CBMemHandle = GlobalAlloc(GHND, DataSize)) != NULL) {
-		if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
-			memcpy(CBMemPtr, DataPtr, DataSize);
-			GlobalUnlock(CBMemHandle);
-			CBMemPtr=NULL;
-			TalkStatus=IdTalkCB;
-		}
-	}
-
-	if (TalkStatus != IdTalkCB) {
-		CBEndPaste();
-	}
-}
-
 // \x82\xB1\x82̊֐\x94\x82̓N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xA8\x82\xE6\x82\xD1DDE\x83f\x81[\x83^\x82\xF0\x92[\x96\x96\x82֑\x97\x82荞\x82ށB
 //
 // CBMemHandle\x83n\x83\x93\x83h\x83\x8B\x82̓O\x83\x8D\x81[\x83o\x83\x8B\x95ϐ\x94\x82Ȃ̂ŁA\x82\xB1\x82̊֐\x94\x82\xAA\x8FI\x97\xB9\x82\xB7\x82\xE9\x82܂ł́A

Modified: trunk/teraterm/teraterm/clipboar.h
===================================================================
--- trunk/teraterm/teraterm/clipboar.h	2016-07-11 08:53:16 UTC (rev 6439)
+++ trunk/teraterm/teraterm/clipboar.h	2016-07-12 09:04:20 UTC (rev 6440)
@@ -11,10 +11,9 @@
 /* prototypes */
 PCHAR CBOpen(LONG MemSize);
 void CBClose();
-void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed,
-		  int BuffSize, PCHAR DataPtr, int DataSize);
+void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly);
+void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed);
 void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer);
-void CBStartEcho(PCHAR DataPtr, int DataSize);
 void CBSend();
 void CBEcho();
 void CBEndPaste();

Modified: trunk/teraterm/teraterm/tekwin.cpp
===================================================================
--- trunk/teraterm/teraterm/tekwin.cpp	2016-07-11 08:53:16 UTC (rev 6439)
+++ trunk/teraterm/teraterm/tekwin.cpp	2016-07-12 09:04:20 UTC (rev 6440)
@@ -485,7 +485,7 @@
 
 void CTEKWindow::OnRButtonUp(UINT nFlags, CPoint point)
 {
-	CBStartPaste(tk.HWin, FALSE, FALSE, 0, NULL, 0);
+	CBStartPaste(tk.HWin, FALSE, FALSE);
 }
 
 void CTEKWindow::OnSetFocus(CWnd* pOldWnd)
@@ -743,12 +743,12 @@
 
 void CTEKWindow::OnEditPaste()
 {
-	CBStartPaste(tk.HWin, FALSE, FALSE, 0, NULL, 0);
+	CBStartPaste(tk.HWin, FALSE, FALSE);
 }
 
 void CTEKWindow::OnEditPasteCR()
 {
-	CBStartPaste(tk.HWin, TRUE, FALSE, 0, NULL, 0);
+	CBStartPaste(tk.HWin, TRUE, FALSE);
 }
 
 void CTEKWindow::OnEditClearScreen()

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2016-07-11 08:53:16 UTC (rev 6439)
+++ trunk/teraterm/teraterm/ttdde.c	2016-07-12 09:04:20 UTC (rev 6440)
@@ -57,9 +57,6 @@
 
 static BOOL AutoLogClose = FALSE;
 
-#define CBBufSize TermWidthMax
-
-
 static void BringupMacroWindow(BOOL flash_flag)
 {
 	HWND hwnd;
@@ -288,7 +285,7 @@
 
 	DataPtr = DdeAccessData(Data,&DataSize);
 	if (DataPtr==NULL) return DDE_FNOTPROCESSED;
-	CBStartPaste(NULL, FALSE, FALSE, CBBufSize, DataPtr, DataSize);
+	CBStartSend(DataPtr, DataSize, FALSE);
 	DdeUnaccessData(Data);
 	if (TalkStatus==IdTalkCB)
 		return (HDDEDATA)DDE_FACK;
@@ -1016,7 +1013,7 @@
 		break;
 
 	case CmdDispStr:
-		CBStartEcho(ParamFileName, sizeof(ParamFileName));
+		CBStartSend(ParamFileName, sizeof(ParamFileName), TRUE);
 		break;
 
 	case CmdLogInfo:

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2016-07-11 08:53:16 UTC (rev 6439)
+++ trunk/teraterm/teraterm/vtwin.cpp	2016-07-12 09:04:20 UTC (rev 6440)
@@ -942,7 +942,7 @@
 
 	if (Paste) {
 		if (CBStartPasteConfirmChange(HVTWin, FALSE)) {
-			CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0);
+			CBStartPaste(HVTWin, FALSE, BracketedPasteMode());
 			// \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g
 			if (WinOrgY != 0) {
 				DispVScroll(SCROLL_BOTTOM, 0);
@@ -4440,7 +4440,7 @@
 {
 	// add confirm (2008.2.4 yutaka)
 	if (CBStartPasteConfirmChange(HVTWin, FALSE)) {
-		CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), 0, NULL, 0);
+		CBStartPaste(HVTWin, FALSE, BracketedPasteMode());
 		// \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g
 		if (WinOrgY != 0) {
 			DispVScroll(SCROLL_BOTTOM, 0);
@@ -4452,7 +4452,7 @@
 {
 	// add confirm (2008.3.11 maya)
 	if (CBStartPasteConfirmChange(HVTWin, TRUE)) {
-		CBStartPaste(HVTWin, TRUE, BracketedPasteMode(), 0, NULL, 0);
+		CBStartPaste(HVTWin, TRUE, BracketedPasteMode());
 		// \x83X\x83N\x83\x8D\x81[\x83\x8B\x88ʒu\x82\xF0\x83\x8A\x83Z\x83b\x83g
 		if (WinOrgY != 0) {
 			DispVScroll(SCROLL_BOTTOM, 0);
@@ -6133,7 +6133,7 @@
 	if (sending) {
 		// \x92[\x96\x96\x82֕\xB6\x8E\x9A\x97\xF1\x82𑗂荞\x82\xDE
 		// DDE\x92ʐM\x82Ɏg\x82\xA4\x8A֐\x94\x82ɕύX\x81B(2006.2.7 yutaka)
-		CBStartPaste(HVTWin, FALSE, BracketedPasteMode(), TermWidthMax/*CBBufSize*/, buf, buflen);
+		CBStartSend(buf, buflen, FALSE);
 		// \x91\x97\x90M\x83f\x81[\x83^\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͑\x97\x90M\x82\xB7\x82\xE9
 		if (TalkStatus == IdTalkCB) {
 			CBSend();



Ttssh2-commit メーリングリストの案内
Back to archive index