Puttyごった煮版のpfwdを改造して自動再接続¶
「pfwd.exeを改造してダイアログ出さずにリトライする」ように改造してみた。
Putty-0.58 ごった煮版を取得
ごった煮版のマニュアルに従って本家の0.58のソースを取得
ごった煮版同梱のpatchを本家0.58に適用
とりあえず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) {