Date: 2007-10-01
Tags: programming, windows

Puttyごった煮版のpfwdを改造して自動再接続

「pfwd.exeを改造してダイアログ出さずにリトライする」ように改造してみた。

  1. Putty-0.58 ごった煮版を取得

  2. ごった煮版のマニュアルに従って本家の0.58のソースを取得

  3. ごった煮版同梱のpatchを本家0.58に適用

  4. とりあえずbuildしてみる。

とりあえずここまでは成功。patch適用はFreeBSD上でやった。buildは WindowsでFreeなCモジュールビルド環境 という環境。Python関係なくWindowsアプリのビルドが出来ますよ。

最後に以下の修正を行ってビルド。

--- putty58/windows/pfwd.c.orig Sun Sep 30 23:50:28 2007
+++ putty58/windows/pfwd.c      Sun Sep 30 23:46:45 2007
@@ -762,11 +761,9 @@
        break;
     case WM_DISCONNECTED:
        ChangeTrayIcon(hwnd, IDI_ICOND);
-       if (DialogBox(m_hInst, MAKEINTRESOURCE(IDD_DISCONNECT), hwnd, DisconnectedProc) == IDOK) {
-           PostMessage(hwnd, WM_CONNECTING, 0, 0);
-       }else{
-           SendMessage(hwnd, WM_CLOSE, 0, 0);
-       }
+       auto_connect_count++;
+       Sleep(1000);
+       PostMessage(hwnd, WM_CONNECTING, 0, 0);
        break;
     case WM_CONNECTING:
        if (m_hThread == NULL) {

WindowMessage処理の中でSleepして大丈夫だったっけ...?ま、いっか。

これでネットワーク切断後も1秒間隔で延々と黙々と接続チャレンジするように なった。

ついでに、切断時と接続時にバルーン表示するようにしてみたところ、激しく目障りだったのでバルーンは使わないようにしよう...。

--- putty58/windows/pfwd.c.orig Sun Sep 30 23:50:28 2007
+++ putty58/windows/pfwd.c      Sun Sep 30 23:56:39 2007
@@ -1,6 +1,7 @@
 /*
  * PLink - a command-line (stdin/stdout) variant of PuTTY.
  */
+#define _WIN32_IE 0x0500

 #include <stdio.h>
 #include <stdlib.h>
@@ -644,6 +645,26 @@
        Shell_NotifyIcon(NIM_ADD, &nid);
 }

+
+static void UpdateBalloon( HWND hwnd, const char* pszTitle, const char *pszText, DWORD dwFlag, unsigned int uTimeout )
+{
+       static NOTIFYICONDATA nid = {
+               sizeof nid,
+               NULL,
+               IDI_ICON,
+       };
+       return;
+       nid.hWnd = hwnd;
+
+       nid.uFlags |= NIF_INFO;
+       strncpy( nid.szInfo, pszText, 255 ); // 255 is specify by MSDN document.
+       nid.uTimeout = uTimeout;
+       strcpy( nid.szInfoTitle, pszTitle );
+       nid.dwInfoFlags = dwFlag;
+
+       Shell_NotifyIcon( NIM_MODIFY, &nid );
+}
+
 static void DelTrayIcon(HWND hwnd)
 {
     NOTIFYICONDATA nid = {
@@ -758,15 +779,17 @@
        break;
     case WM_CONNECTED:
        ChangeTrayIcon(hwnd, IDI_ICON);
+       UpdateBalloon(hwnd, "pfwd", "Connected", NIIF_INFO, 1 );
        auto_connect_count = 0;
        break;
     case WM_DISCONNECTED:
        ChangeTrayIcon(hwnd, IDI_ICOND);
-       if (DialogBox(m_hInst, MAKEINTRESOURCE(IDD_DISCONNECT), hwnd, DisconnectedProc) == IDOK) {
-           PostMessage(hwnd, WM_CONNECTING, 0, 0);
-       }else{
-           SendMessage(hwnd, WM_CLOSE, 0, 0);
+       if (auto_connect_count == 0) {
+           UpdateBalloon(hwnd, "pfwd", "Disconnected", NIIF_WARNING, 1 );
        }
+       auto_connect_count++;
+       Sleep(1000);
+       PostMessage(hwnd, WM_CONNECTING, 0, 0);
        break;
     case WM_CONNECTING:
        if (m_hThread == NULL) {
../../_images/20071001-pfwd-balloon.png