summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (show whitespace changes)
-rw-r--r--PumpKINDlg.cpp109
1 files changed, 101 insertions, 8 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index b6b8a36..4cb1633 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -1,34 +1,36 @@
1// PumpKINDlg.cpp : implementation file 1// PumpKINDlg.cpp : implementation file
2// 2//
3 3
4#include "stdafx.h" 4#include "stdafx.h"
5#include "PumpKIN.h" 5#include "PumpKIN.h"
6#include "PumpKINDlg.h" 6#include "PumpKINDlg.h"
7 7
8#include "ACLTargetCombo.h"
8#include "PropsServer.h" 9#include "PropsServer.h"
9#include "PropsNetwork.h" 10#include "PropsNetwork.h"
10#include "PropsSounds.h" 11#include "PropsSounds.h"
12#include "PropsACL.h"
11#include "ConfirmRRQDlg.h" 13#include "ConfirmRRQDlg.h"
12#include "ConfirmWRQDlg.h" 14#include "ConfirmWRQDlg.h"
13#include "RequestDlg.h" 15#include "RequestDlg.h"
14#include "Resolver.h" 16#include "Resolver.h"
15#include "Retrier.h" 17#include "Retrier.h"
16#include "Trayer.h" 18#include "Trayer.h"
17 19
18#include <io.h> 20#include <io.h>
19 21
20#ifdef _DEBUG 22#ifdef _DEBUG
21#define new DEBUG_NEW 23#define new DEBUG_NEW
22#undef THIS_FILE 24#undef THIS_FILE
23static char THIS_FILE[] = __FILE__; 25static char THIS_FILE[] = __FILE__;
24#endif 26#endif
25 27
26IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket) 28IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket)
27IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket) 29IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket)
28IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket) 30IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket)
29 31
30///////////////////////////////////////////////////////////////////////////// 32/////////////////////////////////////////////////////////////////////////////
31// CAboutDlg dialog used for App About 33// CAboutDlg dialog used for App About
32 34
33class CAboutDlg : public CDialog 35class CAboutDlg : public CDialog
34{ 36{
@@ -58,120 +60,136 @@ CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
58{ 60{
59 //{{AFX_DATA_INIT(CAboutDlg) 61 //{{AFX_DATA_INIT(CAboutDlg)
60 //}}AFX_DATA_INIT 62 //}}AFX_DATA_INIT
61} 63}
62 64
63void CAboutDlg::DoDataExchange(CDataExchange* pDX) 65void CAboutDlg::DoDataExchange(CDataExchange* pDX)
64{ 66{
65 CDialog::DoDataExchange(pDX); 67 CDialog::DoDataExchange(pDX);
66 //{{AFX_DATA_MAP(CAboutDlg) 68 //{{AFX_DATA_MAP(CAboutDlg)
67 //}}AFX_DATA_MAP 69 //}}AFX_DATA_MAP
68} 70}
69 71
70BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 72BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
71 //{{AFX_MSG_MAP(CAboutDlg) 73 //{{AFX_MSG_MAP(CAboutDlg)
72 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) 74 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet)
73 //}}AFX_MSG_MAP 75 //}}AFX_MSG_MAP
74END_MESSAGE_MAP() 76END_MESSAGE_MAP()
75 77
76///////////////////////////////////////////////////////////////////////////// 78/////////////////////////////////////////////////////////////////////////////
77// CPumpKINDlg dialog 79// CPumpKINDlg dialog
78 80
79CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) 81CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
80 : CDialog(CPumpKINDlg::IDD, pParent) 82 : CDialog(CPumpKINDlg::IDD, pParent)
81{ 83{
84 m_Listener.m_Daddy = this;
85
86 m_bListen = TRUE;
87
82 m_ListenPort = 69; 88 m_ListenPort = 69;
83 m_bTFTPSubdirs = TRUE; 89 m_bTFTPSubdirs = TRUE;
84 m_RRQMode = rrqAlwaysConfirm; 90 m_RRQMode = rrqAlwaysConfirm;
85 m_WRQMode = wrqAlwaysConfirm; 91 m_WRQMode = wrqAlwaysConfirm;
86 m_TFTPTimeOut = CTimeSpan(0,0,0,30); 92 m_TFTPTimeOut = CTimeSpan(0,0,0,30);
87 m_RetryTimeOut = CTimeSpan(0,0,0,10); 93 m_RetryTimeOut = CTimeSpan(0,0,0,10);
88 m_LogLength = 100; 94 m_LogLength = 100;
89 m_SpeakPort = 69; 95 m_SpeakPort = 69;
90 m_PromptTimeOut=30; 96 m_PromptTimeOut=30;
91 m_bShown=TRUE; 97 m_bShown=TRUE;
92 m_bExiting=FALSE; 98 m_bExiting=FALSE;
93 m_BlockSize=1024; 99 m_BlockSize=1024;
94 m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); 100 m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource);
95 m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); 101 m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource);
96 m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); 102 m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource);
97 m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); 103 m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone);
98 m_bnwRequest="(bang)"; m_bnwSuccess="(done)"; 104 m_bnwRequest="(bang)"; m_bnwSuccess="(done)";
99 m_bnwAbort="(oops)"; 105 m_bnwAbort="(oops)";
100 //{{AFX_DATA_INIT(CPumpKINDlg) 106 //{{AFX_DATA_INIT(CPumpKINDlg)
101 //}}AFX_DATA_INIT 107 //}}AFX_DATA_INIT
102 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 108 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
103 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 109 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
104 m_bmpBack.LoadBitmap(IDB_BACKGROUND); 110 m_bmpBack.LoadBitmap(IDB_BACKGROUND);
105 m_bmpBack.GetBitmap(&m_bitmapBack); 111 m_bmpBack.GetBitmap(&m_bitmapBack);
106 m_Retrier = new CRetrier(this); 112 m_Retrier = new CRetrier(this);
107 ASSERT(m_Retrier); 113 ASSERT(m_Retrier);
108 m_Trayer = new CTrayer(this); 114 m_Trayer = new CTrayer(this);
109 ASSERT(m_Trayer); 115 ASSERT(m_Trayer);
116 /* Ensure we're backwards compatible */
117 ASSERT(CPumpKINDlg::rrqGiveAll==0);
118 ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1);
119 ASSERT(CPumpKINDlg::rrqDenyAll==2);
120 ASSERT(CPumpKINDlg::wrqTakeAll==0);
121 ASSERT(CPumpKINDlg::wrqConfirmIfExists==1);
122 ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2);
123 ASSERT(CPumpKINDlg::wrqDenyAll==3);
124 /* -- */
110 LoadSettings(); 125 LoadSettings();
111} 126}
112 127
113void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) 128void CPumpKINDlg::DoDataExchange(CDataExchange* pDX)
114{ 129{
115 CDialog::DoDataExchange(pDX); 130 CDialog::DoDataExchange(pDX);
116 //{{AFX_DATA_MAP(CPumpKINDlg) 131 //{{AFX_DATA_MAP(CPumpKINDlg)
132 DDX_Control(pDX, IDC_LISTENING, m_ListenCtl);
117 DDX_Control(pDX, IDC_ABORT, m_AbortCtl); 133 DDX_Control(pDX, IDC_ABORT, m_AbortCtl);
118 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); 134 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
119 DDX_Control(pDX, IDC_LOG, m_Log); 135 DDX_Control(pDX, IDC_LOG, m_Log);
120 DDX_Control(pDX, IDC_CONNECTIONS, m_List); 136 DDX_Control(pDX, IDC_CONNECTIONS, m_List);
121 //}}AFX_DATA_MAP 137 //}}AFX_DATA_MAP
122} 138}
123 139
124BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) 140BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
125 //{{AFX_MSG_MAP(CPumpKINDlg) 141 //{{AFX_MSG_MAP(CPumpKINDlg)
126 ON_WM_SYSCOMMAND() 142 ON_WM_SYSCOMMAND()
127 ON_WM_DESTROY() 143 ON_WM_DESTROY()
128 ON_WM_PAINT() 144 ON_WM_PAINT()
129 ON_WM_QUERYDRAGICON() 145 ON_WM_QUERYDRAGICON()
130 ON_WM_CREATE() 146 ON_WM_CREATE()
131 ON_BN_CLICKED(IDC_OPTIONS, OnOptions) 147 ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
132 ON_WM_TIMER() 148 ON_WM_TIMER()
133 ON_BN_CLICKED(IDC_EXIT, OnExit) 149 ON_BN_CLICKED(IDC_EXIT, OnExit)
134 ON_BN_CLICKED(IDC_PUT, OnPut) 150 ON_BN_CLICKED(IDC_PUT, OnPut)
135 ON_BN_CLICKED(IDC_GET, OnGet) 151 ON_BN_CLICKED(IDC_GET, OnGet)
136 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections) 152 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections)
137 ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections) 153 ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections)
138 ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections) 154 ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections)
139 ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections) 155 ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections)
140 ON_BN_CLICKED(IDC_ABORT, OnAbort) 156 ON_BN_CLICKED(IDC_ABORT, OnAbort)
141 ON_WM_CLOSE() 157 ON_WM_CLOSE()
142 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow) 158 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow)
143 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit) 159 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
144 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin) 160 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin)
145 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile) 161 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile)
146 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp) 162 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp)
147 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions) 163 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions)
148 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile) 164 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile)
149 ON_WM_WINDOWPOSCHANGING() 165 ON_WM_WINDOWPOSCHANGING()
150 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog) 166 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog)
151 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder) 167 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder)
152 ON_WM_DROPFILES() 168 ON_WM_DROPFILES()
153 ON_BN_CLICKED(ID_HELP, OnHelp) 169 ON_BN_CLICKED(ID_HELP, OnHelp)
170 ON_BN_CLICKED(IDC_LISTENING, OnListening)
171 ON_COMMAND(ID_TRAY_LISTEN, OnTrayListen)
154 //}}AFX_MSG_MAP 172 //}}AFX_MSG_MAP
155END_MESSAGE_MAP() 173END_MESSAGE_MAP()
156 174
157///////////////////////////////////////////////////////////////////////////// 175/////////////////////////////////////////////////////////////////////////////
158// CPumpKINDlg message handlers 176// CPumpKINDlg message handlers
159 177
160BOOL CPumpKINDlg::OnInitDialog() 178BOOL CPumpKINDlg::OnInitDialog()
161{ 179{
162 CDialog::OnInitDialog(); 180 CDialog::OnInitDialog();
163 181
164 // Add "About..." menu item to system menu. 182 // Add "About..." menu item to system menu.
165 183
166 // IDM_ABOUTBOX must be in the system command range. 184 // IDM_ABOUTBOX must be in the system command range.
167 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 185 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
168 ASSERT(IDM_ABOUTBOX < 0xF000); 186 ASSERT(IDM_ABOUTBOX < 0xF000);
169 187
170 CMenu* pSysMenu = GetSystemMenu(FALSE); 188 CMenu* pSysMenu = GetSystemMenu(FALSE);
171 CString strAboutMenu; 189 CString strAboutMenu;
172 strAboutMenu.LoadString(IDS_ABOUTBOX); 190 strAboutMenu.LoadString(IDS_ABOUTBOX);
173 if (!strAboutMenu.IsEmpty()) 191 if (!strAboutMenu.IsEmpty())
174 { 192 {
175 pSysMenu->AppendMenu(MF_SEPARATOR); 193 pSysMenu->AppendMenu(MF_SEPARATOR);
176 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 194 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
177 } 195 }
@@ -196,48 +214,50 @@ BOOL CPumpKINDlg::OnInitDialog()
196 m_List.SetTextBkColor(RGB(12,167,0));// Green 214 m_List.SetTextBkColor(RGB(12,167,0));// Green
197 m_List.SetBkColor(RGB(12,167,0));// Green 215 m_List.SetBkColor(RGB(12,167,0));// Green
198CRect listrc; 216CRect listrc;
199 m_List.GetClientRect(&listrc); 217 m_List.GetClientRect(&listrc);
200 m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile); 218 m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile);
201 m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType); 219 m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType);
202 m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer); 220 m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer);
203 m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes); 221 m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes);
204 m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize); 222 m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize);
205 223
206 LogLine(IDS_LOG_START); 224 LogLine(IDS_LOG_START);
207 225
208 SetupButtons(); 226 SetupButtons();
209 227
210CRect rc, drc; 228CRect rc, drc;
211 GetWindowRect(rc); 229 GetWindowRect(rc);
212 GetDesktopWindow()->GetWindowRect(drc); 230 GetDesktopWindow()->GetWindowRect(drc);
213 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); 231 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
214 232
215 if(m_bShown) 233 if(m_bShown)
216 ShowWindow(SW_SHOW); 234 ShowWindow(SW_SHOW);
217 else 235 else
218 ShowWindow(SW_HIDE); 236 ShowWindow(SW_HIDE);
219 237
238 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
239
220 // CG: The following block was added by the ToolTips component. 240 // CG: The following block was added by the ToolTips component.
221 { 241 {
222 // Create the ToolTip control. 242 // Create the ToolTip control.
223 m_tooltip.Create(this); 243 m_tooltip.Create(this);
224 m_tooltip.Activate(TRUE); 244 m_tooltip.Activate(TRUE);
225 245
226 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS); 246 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS);
227 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT); 247 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT);
228 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET); 248 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET);
229 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT); 249 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT);
230 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS); 250 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS);
231 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT); 251 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT);
232 m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP); 252 m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP);
233 m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG); 253 m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG);
234 } 254 }
235 return TRUE; // return TRUE unless you set the focus to a control 255 return TRUE; // return TRUE unless you set the focus to a control
236} 256}
237 257
238void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam) 258void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam)
239{ 259{
240 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 260 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
241 { 261 {
242 CAboutDlg dlgAbout; 262 CAboutDlg dlgAbout;
243 dlgAbout.DoModal(); 263 dlgAbout.DoModal();
@@ -303,53 +323,52 @@ void CPumpKINDlg::OnPaint()
303 bmpDC.CreateCompatibleDC(&pDC); 323 bmpDC.CreateCompatibleDC(&pDC);
304 bmpDC.SelectObject(&m_bmpBack); 324 bmpDC.SelectObject(&m_bmpBack);
305 CRect rc; 325 CRect rc;
306 GetClientRect(&rc); 326 GetClientRect(&rc);
307 for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth) 327 for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth)
308 for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight) 328 for(int y=-m_bitmapBack.bmHeight*2/4;y<rc.Height();y+=m_bitmapBack.bmHeight)
309 pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY); 329 pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY);
310 bmpDC.DeleteDC(); 330 bmpDC.DeleteDC();
311 CDialog::OnPaint(); 331 CDialog::OnPaint();
312 } 332 }
313} 333}
314 334
315// The system calls this to obtain the cursor to display while the user drags 335// The system calls this to obtain the cursor to display while the user drags
316// the minimized window. 336// the minimized window.
317HCURSOR CPumpKINDlg::OnQueryDragIcon() 337HCURSOR CPumpKINDlg::OnQueryDragIcon()
318{ 338{
319 return (HCURSOR) m_hIcon; 339 return (HCURSOR) m_hIcon;
320} 340}
321 341
322int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 342int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
323{ 343{
324 if (CDialog::OnCreate(lpCreateStruct) == -1) 344 if (CDialog::OnCreate(lpCreateStruct) == -1)
325 return -1; 345 return -1;
326 346
327 m_Listener.m_Daddy=this; 347 if(!m_Listener.SetListen(m_bListen)) {
328 if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){ 348 m_bListen=FALSE;
329 TRACE0("Failed to create socket\n"); 349 TRACE0("Failed to create socket\n");
330 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION); 350 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
331 return -1;
332 } 351 }
333 352
334 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){ 353 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){
335 TRACE0("Failed to create trayer\n"); 354 TRACE0("Failed to create trayer\n");
336 return -1; 355 return -1;
337 } 356 }
338 357
339NOTIFYICONDATA nid; 358NOTIFYICONDATA nid;
340 memset(&nid,0,sizeof(nid)); 359 memset(&nid,0,sizeof(nid));
341 nid.cbSize=sizeof(nid); 360 nid.cbSize=sizeof(nid);
342 nid.hWnd=m_Trayer->m_hWnd; 361 nid.hWnd=m_Trayer->m_hWnd;
343 nid.uID=IDC_TRAYICON; 362 nid.uID=IDC_TRAYICON;
344 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 363 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
345 nid.uCallbackMessage=WM_TRAYICON; 364 nid.uCallbackMessage=WM_TRAYICON;
346 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); 365 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
347 // *** Load from resource 366 // *** Load from resource
348 strcpy(nid.szTip,"PumpKIN"); 367 strcpy(nid.szTip,"PumpKIN");
349 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid)); 368 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid));
350 369
351 return 0; 370 return 0;
352} 371}
353 372
354void CListenSocket::OnReceive(int nErrorCode) 373void CListenSocket::OnReceive(int nErrorCode)
355{ 374{
@@ -643,59 +662,64 @@ CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKAD
643 m_Peer.sin_family=AF_INET; 662 m_Peer.sin_family=AF_INET;
644 state=stateNone; 663 state=stateNone;
645 ASSERT(daddy); 664 ASSERT(daddy);
646 m_Daddy=daddy; 665 m_Daddy=daddy;
647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); 666 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds();
648 if(sin){ 667 if(sin){
649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; 668 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr;
650 m_Peer.sin_port=sin->sin_port; 669 m_Peer.sin_port=sin->sin_port;
651 }else 670 }else
652 m_Peer.sin_addr.s_addr=INADDR_NONE; 671 m_Peer.sin_addr.s_addr=INADDR_NONE;
653 m_FileName=fileName; 672 m_FileName=fileName;
654 m_Type=type; 673 m_Type=type;
655} 674}
656 675
657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 676BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
658{ 677{
659 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 678 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
660 return FALSE; 679 return FALSE;
661 ASSERT(m_Daddy); 680 ASSERT(m_Daddy);
662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 681 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
663 m_Daddy->m_Xfers[m_hSocket]=this; 682 m_Daddy->m_Xfers[m_hSocket]=this;
664CString lFile = localFile?localFile:m_FileName; 683CString lFile = localFile?localFile:m_FileName;
665 TurnSlashes(lFile,TRUE); 684 TurnSlashes(lFile,TRUE);
666 UpdateList(); 685 UpdateList();
667 if(!localFile){// Check only if server 686 if(!localFile){// Check only for incoming requests
668 if(CheckBadRelativeness(m_FileName)){ 687 if(CheckBadRelativeness(m_FileName)){
669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 688 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
670 return TRUE; 689 return TRUE;
671 } 690 }
672 switch(m_Daddy->m_RRQMode){ 691 int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opRRQ,m_Peer.sin_addr.s_addr);
692 if(atar<0)
693 atar = m_Daddy->m_RRQMode;
694 switch(atar){
673 case CPumpKINDlg::rrqGiveAll: 695 case CPumpKINDlg::rrqGiveAll:
674 break; 696 break;
675 case CPumpKINDlg::rrqAlwaysConfirm: 697 case CPumpKINDlg::rrqAlwaysConfirm:
676 if(ConfirmRequest()) 698 if(ConfirmRequest())
677 break; 699 break;
700 default:
701 TRACE1("Unexpected access target: %d\n",atar);
678 case CPumpKINDlg::rrqDenyAll: 702 case CPumpKINDlg::rrqDenyAll:
679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 703 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
680 return TRUE; 704 return TRUE;
681 } 705 }
682 } 706 }
683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); 707CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
684CFileException e; 708CFileException e;
685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){ 709 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
686 if(localFile){ 710 if(localFile){
687 CString tmp; 711 CString tmp;
688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn); 712 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
689 m_Daddy->LogLine(tmp); 713 m_Daddy->LogLine(tmp);
690 return FALSE; 714 return FALSE;
691 } 715 }
692 Deny(&e); 716 Deny(&e);
693 return TRUE; 717 return TRUE;
694 } 718 }
695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION 719 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION
696 if(hostName){ 720 if(hostName){
697 m_HostName=hostName; 721 m_HostName=hostName;
698 722
699 CString tmp; 723 CString tmp;
700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); 724 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName);
701 m_Daddy->LogLine(tmp); 725 m_Daddy->LogLine(tmp);
@@ -1086,49 +1110,49 @@ void CXferSocket::Destroy(BOOL success)
1086 success 1110 success
1087 ? m_Daddy->m_bnwSuccess 1111 ? m_Daddy->m_bnwSuccess
1088 : m_Daddy->m_bnwAbort 1112 : m_Daddy->m_bnwAbort
1089 ); 1113 );
1090 if(m_File.m_hFile!=CFile::hFileNull){ 1114 if(m_File.m_hFile!=CFile::hFileNull){
1091 TRY{ 1115 TRY{
1092 m_File.Close(); 1116 m_File.Close();
1093 }CATCH(CFileException,e){ 1117 }CATCH(CFileException,e){
1094 TRACE0("Error closing file\n"); 1118 TRACE0("Error closing file\n");
1095 }END_CATCH 1119 }END_CATCH
1096 } 1120 }
1097 ASSERT(m_Daddy); 1121 ASSERT(m_Daddy);
1098 m_Daddy->KillTimer(m_hSocket); 1122 m_Daddy->KillTimer(m_hSocket);
1099 m_Daddy->m_Xfers.RemoveKey(m_hSocket); 1123 m_Daddy->m_Xfers.RemoveKey(m_hSocket);
1100LV_FINDINFO lvf; 1124LV_FINDINFO lvf;
1101 memset(&lvf,0,sizeof(lvf)); 1125 memset(&lvf,0,sizeof(lvf));
1102 lvf.flags=LVFI_PARAM; 1126 lvf.flags=LVFI_PARAM;
1103 lvf.lParam=(LPARAM)this; 1127 lvf.lParam=(LPARAM)this;
1104int i = m_Daddy->m_List.FindItem(&lvf); 1128int i = m_Daddy->m_List.FindItem(&lvf);
1105 if(i>=0) 1129 if(i>=0)
1106 m_Daddy->m_List.DeleteItem(i); 1130 m_Daddy->m_List.DeleteItem(i);
1107 delete this; 1131 delete this;
1108} 1132}
1109 1133
1110void CPumpKINDlg::LogLine(LPCTSTR str) 1134void CPumpKINDlg::LogLineToScreen(LPCTSTR str)
1111{ 1135{
1112 ASSERT(m_LogLength); 1136 ASSERT(m_LogLength);
1113 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ 1137 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
1114 CTime *t = (CTime*)m_Log.GetItemData(0); 1138 CTime *t = (CTime*)m_Log.GetItemData(0);
1115 if(((DWORD)t)!=LB_ERR){ 1139 if(((DWORD)t)!=LB_ERR){
1116 ASSERT(t); 1140 ASSERT(t);
1117 m_LogTimes.RemoveKey(t); 1141 m_LogTimes.RemoveKey(t);
1118 delete t; 1142 delete t;
1119 } 1143 }
1120 m_Log.DeleteString(0); 1144 m_Log.DeleteString(0);
1121 } 1145 }
1122int i = m_Log.AddString(str); 1146int i = m_Log.AddString(str);
1123 ASSERT(i!=LB_ERR); 1147 ASSERT(i!=LB_ERR);
1124CTime *t = new CTime(CTime::GetCurrentTime()); 1148CTime *t = new CTime(CTime::GetCurrentTime());
1125 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); 1149 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t));
1126 m_Log.SetCurSel(i); 1150 m_Log.SetCurSel(i);
1127} 1151}
1128 1152
1129void CPumpKINDlg::LogLine(UINT msgID) 1153void CPumpKINDlg::LogLine(UINT msgID)
1130{ 1154{
1131CString tmp; 1155CString tmp;
1132 tmp.Format(msgID); 1156 tmp.Format(msgID);
1133 LogLine(tmp); 1157 LogLine(tmp);
1134} 1158}
@@ -1142,153 +1166,167 @@ int s = fn.Find(bBack?'/':'\\');
1142 } 1166 }
1143} 1167}
1144 1168
1145CString CXferSocket::ApplyRoot(LPCTSTR fileName) 1169CString CXferSocket::ApplyRoot(LPCTSTR fileName)
1146{ 1170{
1147 ASSERT(m_Daddy); 1171 ASSERT(m_Daddy);
1148CString fn = fileName; 1172CString fn = fileName;
1149CString rv = m_Daddy->m_TFTPRoot; 1173CString rv = m_Daddy->m_TFTPRoot;
1150 if(rv.IsEmpty()) 1174 if(rv.IsEmpty())
1151 rv = "."; 1175 rv = ".";
1152 if(rv[rv.GetLength()-1]!='\\') 1176 if(rv[rv.GetLength()-1]!='\\')
1153 rv+="\\"; 1177 rv+="\\";
1154 while((!fn.IsEmpty()) && fn[0]=='\\') 1178 while((!fn.IsEmpty()) && fn[0]=='\\')
1155 fn=fn.Mid(1); 1179 fn=fn.Mid(1);
1156 rv+=fn; 1180 rv+=fn;
1157 return rv; 1181 return rv;
1158} 1182}
1159 1183
1160void CPumpKINDlg::OnOptions() 1184void CPumpKINDlg::OnOptions()
1161{ 1185{
1162CPropertySheet cps(IDS_TITLE_OPTIONS,this); 1186CPropertySheet cps(IDS_TITLE_OPTIONS,this);
1163CPropsServer server; 1187CPropsServer server;
1164CPropsNetwork network; 1188CPropsNetwork network;
1165CPropsSounds sounds; 1189CPropsSounds sounds;
1190CPropsACL acl;
1166 1191
1167 server.m_RRQMode=m_RRQMode; 1192 server.m_RRQMode=m_RRQMode;
1168 server.m_TFTPRoot=m_TFTPRoot; 1193 server.m_TFTPRoot=m_TFTPRoot;
1169 server.m_TFTPSubdirs=m_bTFTPSubdirs; 1194 server.m_TFTPSubdirs=m_bTFTPSubdirs;
1170 server.m_WRQMode=m_WRQMode; 1195 server.m_WRQMode=m_WRQMode;
1171 server.m_PromptTimeOut=m_PromptTimeOut; 1196 server.m_PromptTimeOut=m_PromptTimeOut;
1197 server.m_LogFile=m_LogFile;
1172 1198
1173 network.m_ListenPort=m_ListenPort; 1199 network.m_ListenPort=m_ListenPort;
1174 network.m_SpeakPort=m_SpeakPort; 1200 network.m_SpeakPort=m_SpeakPort;
1175 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds(); 1201 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
1176 network.m_BlockSize=m_BlockSize; 1202 network.m_BlockSize=m_BlockSize;
1177 1203
1178 sounds.m_Request = m_bnwRequest; 1204 sounds.m_Request = m_bnwRequest;
1179 sounds.m_Success = m_bnwSuccess; 1205 sounds.m_Success = m_bnwSuccess;
1180 sounds.m_Abort = m_bnwAbort; 1206 sounds.m_Abort = m_bnwAbort;
1181 1207
1208 acl.m_rulist = m_aclRules;
1209
1182 cps.AddPage(&server); 1210 cps.AddPage(&server);
1183 cps.AddPage(&network); 1211 cps.AddPage(&network);
1184 cps.AddPage(&sounds); 1212 cps.AddPage(&sounds);
1213 cps.AddPage(&acl);
1185 if(cps.DoModal()==IDOK){ 1214 if(cps.DoModal()==IDOK){
1186 m_RRQMode=server.m_RRQMode; 1215 m_RRQMode=server.m_RRQMode;
1187 m_TFTPRoot=server.m_TFTPRoot; 1216 m_TFTPRoot=server.m_TFTPRoot;
1188 m_bTFTPSubdirs=server.m_TFTPSubdirs; 1217 m_bTFTPSubdirs=server.m_TFTPSubdirs;
1189 m_WRQMode=server.m_WRQMode; 1218 m_WRQMode=server.m_WRQMode;
1190 m_PromptTimeOut=server.m_PromptTimeOut; 1219 m_PromptTimeOut=server.m_PromptTimeOut;
1220 m_LogFile=server.m_LogFile;
1191 1221
1192 m_ListenPort=network.m_ListenPort; 1222 m_ListenPort=network.m_ListenPort;
1193 m_SpeakPort=network.m_SpeakPort; 1223 m_SpeakPort=network.m_SpeakPort;
1194 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut); 1224 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
1195 m_BlockSize=network.m_BlockSize; 1225 m_BlockSize=network.m_BlockSize;
1196 1226
1197 m_bnwRequest = sounds.m_Request; 1227 m_bnwRequest = sounds.m_Request;
1198 m_bnwSuccess = sounds.m_Success; 1228 m_bnwSuccess = sounds.m_Success;
1199 m_bnwAbort = sounds.m_Abort; 1229 m_bnwAbort = sounds.m_Abort;
1230
1231 m_aclRules = acl.m_rulist;
1232
1233 m_lastlogerr.Empty();
1200 } 1234 }
1201} 1235}
1202 1236
1203BOOL CRRQSocket::ConfirmRequest() 1237BOOL CRRQSocket::ConfirmRequest()
1204{ 1238{
1205CConfirmRRQDlg cd(NULL); 1239CConfirmRRQDlg cd(NULL);
1206 cd.m_Daddy=this; 1240 cd.m_Daddy=this;
1207 cd.m_File=m_FileName; 1241 cd.m_File=m_FileName;
1208 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1242 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1209 if(cd.DoModal()==IDOK) 1243 if(cd.DoModal()==IDOK)
1210 return TRUE; 1244 return TRUE;
1211 return FALSE; 1245 return FALSE;
1212} 1246}
1213 1247
1214CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 1248CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
1215 : CXferSocket(daddy,fileName,type,sin) 1249 : CXferSocket(daddy,fileName,type,sin)
1216{ 1250{
1217 state=stateNone; 1251 state=stateNone;
1218 m_ACK=0; 1252 m_ACK=0;
1219 m_LastSlack=0; 1253 m_LastSlack=0;
1220 m_bResume=FALSE; 1254 m_bResume=FALSE;
1221} 1255}
1222 1256
1223BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 1257BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
1224{ 1258{
1225 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 1259 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
1226 return FALSE; 1260 return FALSE;
1227 ASSERT(m_Daddy); 1261 ASSERT(m_Daddy);
1228 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 1262 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
1229 m_Daddy->m_Xfers[m_hSocket]=this; 1263 m_Daddy->m_Xfers[m_hSocket]=this;
1230 UpdateList(); 1264 UpdateList();
1231CString lf; 1265CString lf;
1232 if(!localFile) { 1266 if(!localFile) {
1233 lf = m_FileName; 1267 lf = m_FileName;
1234 TurnSlashes(lf,TRUE); 1268 TurnSlashes(lf,TRUE);
1235 } 1269 }
1236CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); 1270CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
1237 if(!localFile){// This is an incoming request.. 1271 if(!localFile){// This is an incoming request..
1238 if(CheckBadRelativeness(m_FileName)){ 1272 if(CheckBadRelativeness(m_FileName)){
1239 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1273 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1240 return TRUE; 1274 return TRUE;
1241 } 1275 }
1242 BOOL exists; 1276 BOOL exists;
1243 if(!_access((LPCTSTR)fn,0)) 1277 if(!_access((LPCTSTR)fn,0))
1244 m_Rename=exists=TRUE; 1278 m_Rename=exists=TRUE;
1245 else 1279 else
1246 m_Rename=exists=FALSE; 1280 m_Rename=exists=FALSE;
1247 // *** m_WRQMode only if server transfer 1281 int atar=m_Daddy->m_aclRules.FindTarget(acl_rule::opWRQ,m_Peer.sin_addr.s_addr);
1248 switch(m_Daddy->m_WRQMode){ 1282 if(atar<0)
1283 atar=m_Daddy->m_WRQMode;
1284 switch(atar){
1249 case CPumpKINDlg::wrqTakeAll: 1285 case CPumpKINDlg::wrqTakeAll:
1250 if(exists){ 1286 if(exists){
1251 if(!RenameFile(fn)){ 1287 if(!RenameFile(fn)){
1252 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME); 1288 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
1253 return TRUE; 1289 return TRUE;
1254 } 1290 }
1255 } 1291 }
1256 break; 1292 break;
1257 case CPumpKINDlg::wrqConfirmIfExists: 1293 case CPumpKINDlg::wrqConfirmIfExists:
1258 if(!exists) 1294 if(!exists)
1259 break; 1295 break;
1260 case CPumpKINDlg::wrqAlwaysConfirm: 1296 case CPumpKINDlg::wrqAlwaysConfirm:
1261 if(exists) 1297 if(exists)
1262 m_bResume=TRUE; 1298 m_bResume=TRUE;
1263 if(ConfirmRequest()){ 1299 if(ConfirmRequest()){
1264 if(m_Rename){ 1300 if(m_Rename){
1265 RenameFile(fn); 1301 RenameFile(fn);
1266 if(SaveAs(fn)) 1302 if(SaveAs(fn))
1267 break; 1303 break;
1268 }else 1304 }else
1269 break; 1305 break;
1270 } 1306 }
1307 default:
1308 TRACE1("Unexpected access target: %d\n",atar);
1271 case CPumpKINDlg::wrqDenyAll: 1309 case CPumpKINDlg::wrqDenyAll:
1272 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1310 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1273 return TRUE; 1311 return TRUE;
1274 } 1312 }
1275 } 1313 }
1276CFileException e; 1314CFileException e;
1277 if(!m_File.Open( 1315 if(!m_File.Open(
1278 fn, 1316 fn,
1279 m_bResume 1317 m_bResume
1280 ?(CFile::modeWrite|CFile::shareDenyWrite) 1318 ?(CFile::modeWrite|CFile::shareDenyWrite)
1281 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite), 1319 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
1282 &e 1320 &e
1283 )){ 1321 )){
1284 if(localFile){// Outgoing request 1322 if(localFile){// Outgoing request
1285 CString tmp; 1323 CString tmp;
1286 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); 1324 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn);
1287 m_Daddy->LogLine(tmp); 1325 m_Daddy->LogLine(tmp);
1288 return FALSE; 1326 return FALSE;
1289 }else{ 1327 }else{
1290 Deny(&e); 1328 Deny(&e);
1291 return TRUE; 1329 return TRUE;
1292 } 1330 }
1293 } 1331 }
1294 if(hostName){ 1332 if(hostName){
@@ -1774,90 +1812,96 @@ CAboutDlg dlgAbout;
1774void CPumpKINDlg::OnTrayFetchfile() 1812void CPumpKINDlg::OnTrayFetchfile()
1775{ 1813{
1776 OnGet(); 1814 OnGet();
1777} 1815}
1778 1816
1779void CPumpKINDlg::OnTrayHelp() 1817void CPumpKINDlg::OnTrayHelp()
1780{ 1818{
1781 OnHelp(); 1819 OnHelp();
1782} 1820}
1783 1821
1784void CPumpKINDlg::OnTrayOptions() 1822void CPumpKINDlg::OnTrayOptions()
1785{ 1823{
1786 OnOptions(); 1824 OnOptions();
1787} 1825}
1788 1826
1789void CPumpKINDlg::OnTraySendfile() 1827void CPumpKINDlg::OnTraySendfile()
1790{ 1828{
1791 OnPut(); 1829 OnPut();
1792} 1830}
1793 1831
1794void CPumpKINDlg::LoadSettings() 1832void CPumpKINDlg::LoadSettings()
1795{ 1833{
1796CWinApp *app = AfxGetApp(); 1834CWinApp *app = AfxGetApp();
1797 ASSERT(app); 1835 ASSERT(app);
1836 m_bListen=app->GetProfileInt("TFTPSettings","Listen",m_bListen);
1798 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest); 1837 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
1799 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess); 1838 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
1800 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort); 1839 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort);
1801 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1840 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1802 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1841 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1803 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength); 1842 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength);
1804 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1843 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1805 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1844 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1806 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1845 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1807 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1846 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1847 m_LogFile=app->GetProfileString("General","LogFile",m_LogFile);
1808 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds())); 1848 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
1809 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1849 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1810 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds())); 1850 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()));
1811 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1851 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1812 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown); 1852 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown);
1813 if(m_TFTPRoot.IsEmpty()){ 1853 if(m_TFTPRoot.IsEmpty()){
1814 DWORD dL = ::GetCurrentDirectory(0,NULL); 1854 DWORD dL = ::GetCurrentDirectory(0,NULL);
1815 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL))); 1855 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL)));
1816 m_TFTPRoot.ReleaseBuffer(); 1856 m_TFTPRoot.ReleaseBuffer();
1817 } 1857 }
1818 ::SetCurrentDirectory(m_TFTPRoot); 1858 ::SetCurrentDirectory(m_TFTPRoot);
1859 m_aclRules.LoadProfile(app);
1819} 1860}
1820 1861
1821void CPumpKINDlg::SaveSettings() 1862void CPumpKINDlg::SaveSettings()
1822{ 1863{
1823CWinApp *app = AfxGetApp(); 1864CWinApp *app = AfxGetApp();
1824 ASSERT(app); 1865 ASSERT(app);
1866 app->WriteProfileInt("TFTPSettings","Listen",m_bListen);
1825 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest); 1867 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
1826 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess); 1868 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
1827 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort); 1869 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort);
1828 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1870 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1829 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1871 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1830 app->WriteProfileInt("UISettings","LogLength",m_LogLength); 1872 app->WriteProfileInt("UISettings","LogLength",m_LogLength);
1831 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1873 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1832 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1874 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1833 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1875 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1834 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1876 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1877 app->WriteProfileString("General","LogFile",m_LogFile);
1835 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()); 1878 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
1836 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1879 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1837 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()); 1880 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds());
1838 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1881 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1839 app->WriteProfileInt("UISettings","Visble",m_bShown); 1882 app->WriteProfileInt("UISettings","Visble",m_bShown);
1883 m_aclRules.SaveProfile(app);
1840} 1884}
1841 1885
1842void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 1886void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
1843{ 1887{
1844 CDialog::OnWindowPosChanging(lpwndpos); 1888 CDialog::OnWindowPosChanging(lpwndpos);
1845 if(!m_bExiting){ 1889 if(!m_bExiting){
1846 if(m_bShown){ 1890 if(m_bShown){
1847 lpwndpos->flags&=~SWP_HIDEWINDOW; 1891 lpwndpos->flags&=~SWP_HIDEWINDOW;
1848 lpwndpos->flags|=SWP_SHOWWINDOW; 1892 lpwndpos->flags|=SWP_SHOWWINDOW;
1849 }else{ 1893 }else{
1850 lpwndpos->flags&=~SWP_SHOWWINDOW; 1894 lpwndpos->flags&=~SWP_SHOWWINDOW;
1851 lpwndpos->flags|=SWP_HIDEWINDOW; 1895 lpwndpos->flags|=SWP_HIDEWINDOW;
1852 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu)) 1896 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu))
1853 GetDesktopWindow()->SetForegroundWindow(); 1897 GetDesktopWindow()->SetForegroundWindow();
1854 } 1898 }
1855 } 1899 }
1856} 1900}
1857 1901
1858CString CXferSocket::ApplyRootGently(LPCTSTR fn) 1902CString CXferSocket::ApplyRootGently(LPCTSTR fn)
1859{ 1903{
1860CString f = fn; 1904CString f = fn;
1861CString rv = f; 1905CString rv = f;
1862 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0) 1906 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0)
1863 rv = ApplyRoot(f); 1907 rv = ApplyRoot(f);
@@ -1963,24 +2007,73 @@ void CXferSocket::OnRetry()
1963 m_bRetry=FALSE; 2007 m_bRetry=FALSE;
1964} 2008}
1965 2009
1966tftp* tftp::Copy(tftp *src) 2010tftp* tftp::Copy(tftp *src)
1967{ 2011{
1968 ASSERT(src); 2012 ASSERT(src);
1969 ASSERT(src->length); 2013 ASSERT(src->length);
1970tftp* rv = Allocate(src->length); 2014tftp* rv = Allocate(src->length);
1971 ASSERT(rv); 2015 ASSERT(rv);
1972 memmove(rv,src,tftpSlackSize+src->length); 2016 memmove(rv,src,tftpSlackSize+src->length);
1973 return rv; 2017 return rv;
1974} 2018}
1975 2019
1976void CXferSocket::SetTry(tftp *p) 2020void CXferSocket::SetTry(tftp *p)
1977{ 2021{
1978 if(m_Retry) 2022 if(m_Retry)
1979 delete m_Retry; 2023 delete m_Retry;
1980 m_Retry=p?tftp::Copy(p):NULL; 2024 m_Retry=p?tftp::Copy(p):NULL;
1981} 2025}
1982 2026
1983void CPumpKINDlg::OnHelp() 2027void CPumpKINDlg::OnHelp()
1984{ 2028{
1985 AfxGetApp()->WinHelp(0,HELP_FINDER); 2029 AfxGetApp()->WinHelp(0,HELP_FINDER);
1986} 2030}
2031
2032BOOL CListenSocket::SetListen(BOOL b) {
2033 ASSERT(m_Daddy);
2034 if(b==m_bListen)
2035 return TRUE;
2036 if(b) {
2037 if(!Create(m_Daddy->m_ListenPort,SOCK_DGRAM))
2038 return FALSE;
2039 return m_bListen=TRUE;
2040 }else{
2041 Close(); m_bListen=FALSE;
2042 return TRUE;
2043 }
2044}
2045
2046void CPumpKINDlg::OnListening()
2047{
2048 if(!m_Listener.SetListen(m_ListenCtl.GetCheck()==1)) {
2049 TRACE0("Failed to create socket\n");
2050 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
2051 }
2052 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
2053 m_bListen=m_Listener.m_bListen;
2054}
2055
2056void CPumpKINDlg::OnTrayListen()
2057{
2058 if(!m_Listener.SetListen(!m_Listener.m_bListen)) {
2059 TRACE0("Failed to create socket\n");
2060 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
2061 }
2062 m_ListenCtl.SetCheck(m_Listener.m_bListen?1:0);
2063 m_bListen=m_Listener.m_bListen;
2064}
2065
2066void CPumpKINDlg::LogLine(LPCTSTR str)
2067{
2068 LogLineToScreen(str);
2069 if(!m_LogFile.IsEmpty()) {
2070 if(!Klever::LogRecord((LPCTSTR)m_LogFile,str)) {
2071 if(m_lastlogerr!=m_LogFile) {
2072 CString tmp;
2073 tmp.Format(IDS_LOG_LOGERROR,m_LogFile);
2074 LogLineToScreen(tmp);
2075 m_lastlogerr=m_LogFile;
2076 }
2077 }
2078 }
2079}