• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision6887 (tree)
Time2017-07-26 12:47:55
Authordoda

Log Message

sendbroadcast, sendlnbroadcast が動かない問題を修正。[Ttssh2-devel 3326], Ticket #37401

・メインのループ部分が大きく違うので、ダイアログでの操作とマクロコマンドで関数を分離した
・parent_only の時にループ変数をいじって無理やり一回で抜けるのは判り辛いので、

最初に parent_only かどうかを判定するようにした。
parent_only の時はループしないというのを明示する意味もある。

ついでに sendmulticast の方も微修正
・malloc() に失敗した時に free() するのは意味が無いのでそのまま return する。
・memcpy() ⇒ memcpy_s()

Change Summary

Incremental Difference

--- trunk/doc/en/html/about/history.html (revision 6886)
+++ trunk/doc/en/html/about/history.html (revision 6887)
@@ -50,6 +50,7 @@
5050 <li>Bug fixes
5151 <ul>
5252 <li>The response of DECLRMM status query by DECRQM was invalid.</li>
53+ <li><a href="../macro/command/sendbroadcast.html">sendbroadcast</a> and <a href="../macro/command/sendlnbroadcast.html">sendlnbroadcast</a> macro command does not work.</li>
5354 <li><a href="../macro/command/sendbroadcast.html">sendbroadcast</a>, <a href="../macro/command/sendlnbroadcast.html">sendlnbroadcast</a> and <a href="../macro/command/sendmulticast.html">sendmulticast</a> macro command can't send the character of 0x00 or 0x01.</li>
5455 </ul>
5556 </li>
--- trunk/doc/ja/html/about/history.html (revision 6886)
+++ trunk/doc/ja/html/about/history.html (revision 6887)
@@ -50,6 +50,7 @@
5050 <li>バグ修正
5151 <ul>
5252 <li>DECRQM 制御シーケンスで DECLRMM の状態を正しく返さない問題を修正した。</li>
53+ <li><a href="../macro/command/sendbroadcast.html">sendbroadcast</a> / <a href="../macro/command/sendlnbroadcast.html">sendlnbroadcast</a> マクロコマンドが正しく働かない問題を修正した。</li>
5354 <li><a href="../macro/command/sendbroadcast.html">sendbroadcast</a> / <a href="../macro/command/sendlnbroadcast.html">sendlnbroadcast</a> / <a href="../macro/command/sendmulticast.html">sendmulticast</a> マクロコマンドで、0x00, 0x01 が正しく送れない問題を修正した。</li>
5455 </ul>
5556 </li>
--- trunk/teraterm/teraterm/ttdde.c (revision 6886)
+++ trunk/teraterm/teraterm/ttdde.c (revision 6887)
@@ -964,7 +964,7 @@
964964 break;
965965
966966 case CmdSendBroadcast: // 'sendbroadcast'
967- SendAllBroadcastMessage(HVTWin, HVTWin, 0, ParamFileName, strlen(ParamFileName));
967+ SendBroadcastMessage(HVTWin, HVTWin, ParamFileName, strlen(ParamFileName));
968968 break;
969969
970970 case CmdSendMulticast: // 'sendmulticast'
--- trunk/teraterm/teraterm/vtwin.cpp (revision 6886)
+++ trunk/teraterm/teraterm/vtwin.cpp (revision 6887)
@@ -5580,11 +5580,10 @@
55805580 }
55815581
55825582 /*
5583- * 全 Tera Term へメッセージを送信するブロードキャストモード。
5584- * "sendbroadcast"マクロコマンドからも利用される。
5583+ * ダイアログで選択されたウィンドウのみ、もしくは親ウィンドウのみに送るブロードキャストモード。
5584+ * リアルタイムモードが off の時に利用される。
55855585 */
5586-extern "C"
5587-void SendAllBroadcastMessage(HWND HVTWin, HWND hWnd, int parent_only, char *buf, int buflen)
5586+void SendBroadcastMessageToSelected(HWND HVTWin, HWND hWnd, int parent_only, char *buf, int buflen)
55885587 {
55895588 int i;
55905589 int count;
@@ -5596,28 +5595,52 @@
55965595 cds.cbData = buflen;
55975596 cds.lpData = buf;
55985597
5599- // すべてのTera Termにメッセージとデータを送る
5600- count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
5601- for (i = 0 ; i < count ; i++) {
5602- hd = NULL;
5603- if (parent_only) {
5604- hd = GetParent(hWnd);
5605- i = MAXNWIN; // 337: 強引かつ直値 :P
5606- } else {
5598+ if (parent_only) {
5599+ // 親ウィンドウのみに WM_COPYDATA メッセージを送る
5600+ SendMessage(GetParent(hWnd), WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
5601+ }
5602+ else {
5603+ // ダイアログで選択されたウィンドウにメッセージを送る
5604+ count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
5605+ for (i = 0 ; i < count ; i++) {
56075606 // リストボックスで選択されているか
56085607 if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
5609- hd = GetNthWin(i);
5608+ if ((hd = GetNthWin(i)) != NULL) {
5609+ // WM_COPYDATAを使って、プロセス間通信を行う。
5610+ SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
5611+ }
56105612 }
56115613 }
5612- if (hd == NULL) {
5613- continue;
5614+ }
5615+}
5616+
5617+/*
5618+ * 全 Tera Term へメッセージを送信するブロードキャストモード。
5619+ * "sendbroadcast"マクロコマンドからのみ利用される。
5620+ */
5621+extern "C"
5622+void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen)
5623+{
5624+ int i;
5625+ HWND hd;
5626+ COPYDATASTRUCT cds;
5627+
5628+ ZeroMemory(&cds, sizeof(cds));
5629+ cds.dwData = IPC_BROADCAST_COMMAND;
5630+ cds.cbData = buflen;
5631+ cds.lpData = buf;
5632+
5633+ // 全 Tera Term へメッセージを送る。
5634+ for (i = 0 ; i < MAXNWIN ; i++) {
5635+ if ((hd = GetNthWin(i)) == NULL) {
5636+ break;
56145637 }
5615-
56165638 // WM_COPYDATAを使って、プロセス間通信を行う。
56175639 SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
56185640 }
56195641 }
56205642
5643+
56215644 /*
56225645 * 任意の Tera Term 群へメッセージを送信するマルチキャストモード。厳密には、
56235646 * ブロードキャスト送信を行い、受信側でメッセージを取捨選択する。
@@ -5644,12 +5667,11 @@
56445667 */
56455668 nlen = strlen(name) + 1;
56465669 msglen = nlen + buflen;
5647- msg = (char *)malloc(msglen);
5648- if (msg == NULL) {
5649- goto error;
5670+ if ((msg = (char *)malloc(msglen)) == NULL) {
5671+ return;
56505672 }
56515673 strcpy_s(msg, msglen, name);
5652- memcpy(msg + nlen, buf, buflen);
5674+ memcpy_s(msg + nlen, msglen - nlen, buf, buflen);
56535675
56545676 ZeroMemory(&cds, sizeof(cds));
56555677 cds.dwData = IPC_MULTICAST_COMMAND;
@@ -5658,8 +5680,7 @@
56585680
56595681 // すべてのTera Termにメッセージとデータを送る
56605682 for (i = 0 ; i < MAXNWIN ; i++) {
5661- hd = GetNthWin(i);
5662- if (hd == NULL) {
5683+ if ((hd = GetNthWin(i)) == NULL) {
56635684 break;
56645685 }
56655686
@@ -5667,7 +5688,6 @@
56675688 SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
56685689 }
56695690
5670-error:
56715691 free(msg);
56725692 }
56735693
@@ -5930,7 +5950,7 @@
59305950 // 337: 2007/03/20 チェックされていたら親ウィンドウにのみ送信
59315951 checked = SendMessage(GetDlgItem(hWnd, IDC_PARENT_ONLY), BM_GETCHECK, 0, 0);
59325952
5933- SendAllBroadcastMessage(HVTWin, hWnd, checked, buf, strlen(buf));
5953+ SendBroadcastMessageToSelected(HVTWin, hWnd, checked, buf, strlen(buf));
59345954 }
59355955
59365956 // モードレスダイアログは一度生成されると、アプリケーションが終了するまで
--- trunk/teraterm/teraterm/vtwin.h (revision 6886)
+++ trunk/teraterm/teraterm/vtwin.h (revision 6887)
@@ -224,7 +224,7 @@
224224 extern "C" {
225225 #endif
226226
227-void SendAllBroadcastMessage(HWND HVTWin, HWND hWnd, int parent_only, char *buf, int buflen);
227+void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen);
228228 void SendMulticastMessage(HWND HVTWin, HWND hWnd, char *name, char *buf, int buflen);
229229 void SetMulticastName(char *name);
230230
Show on old repository browser