summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (ignore 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,869 +1,893 @@
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{
35public: 37public:
36 CAboutDlg(); 38 CAboutDlg();
37 39
38// Dialog Data 40// Dialog Data
39 //{{AFX_DATA(CAboutDlg) 41 //{{AFX_DATA(CAboutDlg)
40 enum { IDD = IDD_ABOUTBOX }; 42 enum { IDD = IDD_ABOUTBOX };
41 //}}AFX_DATA 43 //}}AFX_DATA
42 44
43 // ClassWizard generated virtual function overrides 45 // ClassWizard generated virtual function overrides
44 //{{AFX_VIRTUAL(CAboutDlg) 46 //{{AFX_VIRTUAL(CAboutDlg)
45 protected: 47 protected:
46 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 48 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
47 //}}AFX_VIRTUAL 49 //}}AFX_VIRTUAL
48 50
49// Implementation 51// Implementation
50protected: 52protected:
51 //{{AFX_MSG(CAboutDlg) 53 //{{AFX_MSG(CAboutDlg)
52 afx_msg void OnKlevernet(); 54 afx_msg void OnKlevernet();
53 //}}AFX_MSG 55 //}}AFX_MSG
54 DECLARE_MESSAGE_MAP() 56 DECLARE_MESSAGE_MAP()
55}; 57};
56 58
57CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 59CAboutDlg::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 }
178 196
179 // Set the icon for this dialog. The framework does this automatically 197 // Set the icon for this dialog. The framework does this automatically
180 // when the application's main window is not a dialog 198 // when the application's main window is not a dialog
181 SetIcon(m_hIcon, TRUE); // Set big icon 199 SetIcon(m_hIcon, TRUE); // Set big icon
182 SetIcon(m_hIcon, FALSE); // Set small icon 200 SetIcon(m_hIcon, FALSE); // Set small icon
183 201
184 VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0)); 202 VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0));
185 203
186 204
187 m_Images.Create(16,16,TRUE,2,1); 205 m_Images.Create(16,16,TRUE,2,1);
188 m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ)); 206 m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ));
189 m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ)); 207 m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ));
190 ASSERT(m_iRRQ>=0); 208 ASSERT(m_iRRQ>=0);
191 ASSERT(m_iWRQ>=0); 209 ASSERT(m_iWRQ>=0);
192 m_List.SetImageList(&m_Images,LVSIL_NORMAL); 210 m_List.SetImageList(&m_Images,LVSIL_NORMAL);
193 m_List.SetImageList(&m_Images,LVSIL_SMALL); 211 m_List.SetImageList(&m_Images,LVSIL_SMALL);
194 m_List.SetImageList(&m_Images,LVSIL_STATE); 212 m_List.SetImageList(&m_Images,LVSIL_STATE);
195 m_List.SetTextColor(RGB(255,255,0));// Yellow 213 m_List.SetTextColor(RGB(255,255,0));// Yellow
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();
244 } 264 }
245 else 265 else
246 { 266 {
247 CDialog::OnSysCommand(nID, lParam); 267 CDialog::OnSysCommand(nID, lParam);
248 } 268 }
249} 269}
250 270
251void CPumpKINDlg::OnDestroy() 271void CPumpKINDlg::OnDestroy()
252{ 272{
253 SaveSettings(); 273 SaveSettings();
254 274
255NOTIFYICONDATA nid; 275NOTIFYICONDATA nid;
256 memset(&nid,0,sizeof(nid)); 276 memset(&nid,0,sizeof(nid));
257 nid.cbSize=sizeof(nid); 277 nid.cbSize=sizeof(nid);
258 nid.hWnd=m_Trayer->m_hWnd; 278 nid.hWnd=m_Trayer->m_hWnd;
259 nid.uID=IDC_TRAYICON; 279 nid.uID=IDC_TRAYICON;
260 nid.uFlags=0; 280 nid.uFlags=0;
261 VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid)); 281 VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid));
262 282
263 WinHelp(0L, HELP_QUIT); 283 WinHelp(0L, HELP_QUIT);
264 CDialog::OnDestroy(); 284 CDialog::OnDestroy();
265POSITION p = m_LogTimes.GetStartPosition(); 285POSITION p = m_LogTimes.GetStartPosition();
266 while(p){ 286 while(p){
267 CTime *t,*tt; 287 CTime *t,*tt;
268 m_LogTimes.GetNextAssoc(p,t,tt); 288 m_LogTimes.GetNextAssoc(p,t,tt);
269 ASSERT(t && tt && t==tt); 289 ASSERT(t && tt && t==tt);
270 delete t; 290 delete t;
271 } 291 }
272 // *** Abort and cleanup transfers 292 // *** Abort and cleanup transfers
273 m_LogTimes.RemoveAll(); 293 m_LogTimes.RemoveAll();
274} 294}
275 295
276// If you add a minimize button to your dialog, you will need the code below 296// If you add a minimize button to your dialog, you will need the code below
277// to draw the icon. For MFC applications using the document/view model, 297// to draw the icon. For MFC applications using the document/view model,
278// this is automatically done for you by the framework. 298// this is automatically done for you by the framework.
279 299
280void CPumpKINDlg::OnPaint() 300void CPumpKINDlg::OnPaint()
281{ 301{
282 if (IsIconic()) 302 if (IsIconic())
283 { 303 {
284 CPaintDC dc(this); // device context for painting 304 CPaintDC dc(this); // device context for painting
285 305
286 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 306 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
287 307
288 // Center icon in client rectangle 308 // Center icon in client rectangle
289 int cxIcon = GetSystemMetrics(SM_CXICON); 309 int cxIcon = GetSystemMetrics(SM_CXICON);
290 int cyIcon = GetSystemMetrics(SM_CYICON); 310 int cyIcon = GetSystemMetrics(SM_CYICON);
291 CRect rect; 311 CRect rect;
292 GetClientRect(&rect); 312 GetClientRect(&rect);
293 int x = (rect.Width() - cxIcon + 1) / 2; 313 int x = (rect.Width() - cxIcon + 1) / 2;
294 int y = (rect.Height() - cyIcon + 1) / 2; 314 int y = (rect.Height() - cyIcon + 1) / 2;
295 315
296 // Draw the icon 316 // Draw the icon
297 dc.DrawIcon(x, y, m_hIcon); 317 dc.DrawIcon(x, y, m_hIcon);
298 } 318 }
299 else 319 else
300 { 320 {
301 CPaintDC pDC(this); 321 CPaintDC pDC(this);
302 CDC bmpDC; 322 CDC bmpDC;
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{
356 ASSERT(m_Daddy); 375 ASSERT(m_Daddy);
357 if(nErrorCode){ 376 if(nErrorCode){
358 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR); 377 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR);
359 return; 378 return;
360 } 379 }
361DWORD fionread = 0; 380DWORD fionread = 0;
362 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired 381 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired
363tftp *tftpRQ = tftp::Allocate(fionread); 382tftp *tftpRQ = tftp::Allocate(fionread);
364 ASSERT(tftpRQ); 383 ASSERT(tftpRQ);
365SOCKADDR_IN sin; 384SOCKADDR_IN sin;
366 if(!tftpRQ->Receive(this,fionread,&sin)){ 385 if(!tftpRQ->Receive(this,fionread,&sin)){
367 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR); 386 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR);
368 delete tftpRQ; 387 delete tftpRQ;
369 return; 388 return;
370 } 389 }
371 #ifndefNDEBUG 390 #ifndefNDEBUG
372CString tmp; 391CString tmp;
373 tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port); 392 tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port);
374 TRACE0(tmp); 393 TRACE0(tmp);
375#endif 394#endif
376POSITION p = m_Daddy->m_Xfers.GetStartPosition(); 395POSITION p = m_Daddy->m_Xfers.GetStartPosition();
377 while(p){ 396 while(p){
378 SOCKET key; 397 SOCKET key;
379 CXferSocket *sock; 398 CXferSocket *sock;
380 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock); 399 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock);
381 ASSERT(sock); 400 ASSERT(sock);
382 if(sock->m_Peer.sin_addr.s_addr==sin.sin_addr.s_addr && sock->m_Peer.sin_port==sin.sin_port){ 401 if(sock->m_Peer.sin_addr.s_addr==sin.sin_addr.s_addr && sock->m_Peer.sin_port==sin.sin_port){
383 TRACE0("Ignoring request which we are already processing\n"); 402 TRACE0("Ignoring request which we are already processing\n");
384 delete tftpRQ; 403 delete tftpRQ;
385 return; 404 return;
386 } 405 }
387 } 406 }
388 switch(tftpRQ->Opcode()){ 407 switch(tftpRQ->Opcode()){
389 case tftp::opRRQ: 408 case tftp::opRRQ:
390 // Read Request 409 // Read Request
391 { 410 {
392 CString tmp; 411 CString tmp;
393 tmp.Format(IDS_LOG_RRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr)); 412 tmp.Format(IDS_LOG_RRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr));
394 m_Daddy->LogLine(tmp); 413 m_Daddy->LogLine(tmp);
395 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 414 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
396 ASSERT(s); 415 ASSERT(s);
397 tftpRQ->GetOptions(&s->m_Options); 416 tftpRQ->GetOptions(&s->m_Options);
398 if(!s->Create()) 417 if(!s->Create())
399 s->Destroy(FALSE); 418 s->Destroy(FALSE);
400 } 419 }
401 break; 420 break;
402 case tftp::opWRQ: 421 case tftp::opWRQ:
403 // Write Request 422 // Write Request
404 { 423 {
405 CString tmp; 424 CString tmp;
406 tmp.Format(IDS_LOG_WRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr)); 425 tmp.Format(IDS_LOG_WRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr));
407 m_Daddy->LogLine(tmp); 426 m_Daddy->LogLine(tmp);
408 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 427 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
409 ASSERT(s); 428 ASSERT(s);
410 tftpRQ->GetOptions(&s->m_Options); 429 tftpRQ->GetOptions(&s->m_Options);
411 if(!s->Create(NULL,NULL)) 430 if(!s->Create(NULL,NULL))
412 s->Destroy(FALSE); 431 s->Destroy(FALSE);
413 } 432 }
414 break; 433 break;
415 default: 434 default:
416 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE); 435 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE);
417 delete tftpRQ; 436 delete tftpRQ;
418 return; 437 return;
419 } 438 }
420 delete tftpRQ; 439 delete tftpRQ;
421} 440}
422 441
423BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin) 442BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin)
424{ 443{
425 ASSERT(socket); 444 ASSERT(socket);
426int saddrLen = sizeof(SOCKADDR_IN); 445int saddrLen = sizeof(SOCKADDR_IN);
427 length = sin ? 446 length = sin ?
428 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen) 447 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen)
429 : 448 :
430 socket->Receive(udpBase(),maxLength) 449 socket->Receive(udpBase(),maxLength)
431 ; 450 ;
432 if(!length) 451 if(!length)
433 return FALSE; 452 return FALSE;
434 if(length==(tftpLength)SOCKET_ERROR) 453 if(length==(tftpLength)SOCKET_ERROR)
435 return FALSE; 454 return FALSE;
436 return TRUE; 455 return TRUE;
437} 456}
438 457
439UINT tftp::Opcode() 458UINT tftp::Opcode()
440{ 459{
441 return REVERSEBYTES(opcode); 460 return REVERSEBYTES(opcode);
442} 461}
443 462
444CString tftp::rqFileName() 463CString tftp::rqFileName()
445{ 464{
446 ASSERT(length); 465 ASSERT(length);
447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 466 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
448CString rv; 467CString rv;
449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode))) 468 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode)))
450 rv = (LPCTSTR)data.m_RQ.data; 469 rv = (LPCTSTR)data.m_RQ.data;
451 return rv; 470 return rv;
452} 471}
453 472
454CString tftp::rqType() 473CString tftp::rqType()
455{ 474{
456 ASSERT(length); 475 ASSERT(length);
457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 476 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
458CString rv; 477CString rv;
459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 478char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
460 if(tmp++) 479 if(tmp++)
461 rv = (LPCTSTR)tmp; 480 rv = (LPCTSTR)tmp;
462 return rv; 481 return rv;
463} 482}
464 483
465UINT tftp::GetOptions(tftp::tftpOptions* ops) 484UINT tftp::GetOptions(tftp::tftpOptions* ops)
466{ 485{
467 ASSERT(length); 486 ASSERT(length);
468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK); 487 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK);
469 ASSERT(ops); 488 ASSERT(ops);
470tftpOptions& o = *ops; 489tftpOptions& o = *ops;
471LPSTR base = (LPSTR)&data.m_RQ.data; 490LPSTR base = (LPSTR)&data.m_RQ.data;
472UINT basePtr = 0; 491UINT basePtr = 0;
473 if(Opcode()==opRRQ || Opcode()==opWRQ){ 492 if(Opcode()==opRRQ || Opcode()==opWRQ){
474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 493 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
475 if(!base) 494 if(!base)
476 return 0; 495 return 0;
477 base++; 496 base++;
478 basePtr = (base-(LPSTR)&data.m_RQ.data); 497 basePtr = (base-(LPSTR)&data.m_RQ.data);
479 base = (LPSTR)memchr(base,0,length-basePtr); 498 base = (LPSTR)memchr(base,0,length-basePtr);
480 if(!base) 499 if(!base)
481 return 0; 500 return 0;
482 base++; 501 base++;
483 basePtr = (base-(LPSTR)&data.m_RQ.data); 502 basePtr = (base-(LPSTR)&data.m_RQ.data);
484 } 503 }
485 ops->RemoveAll(); 504 ops->RemoveAll();
486UINT rv = 0; 505UINT rv = 0;
487 while(basePtr<(length-sizeof(opcode))){ 506 while(basePtr<(length-sizeof(opcode))){
488 CString onam = (LPSTR)&data.m_RQ.data[basePtr]; 507 CString onam = (LPSTR)&data.m_RQ.data[basePtr];
489 basePtr+=onam.GetLength()+1; 508 basePtr+=onam.GetLength()+1;
490 CString oval = (LPSTR)&data.m_RQ.data[basePtr]; 509 CString oval = (LPSTR)&data.m_RQ.data[basePtr];
491 basePtr+=oval.GetLength()+1; 510 basePtr+=oval.GetLength()+1;
492 onam.MakeLower(); 511 onam.MakeLower();
493 o[onam]=oval; 512 o[onam]=oval;
494 rv++; 513 rv++;
495 } 514 }
496 return rv; 515 return rv;
497} 516}
498 517
499tftp::tftp() 518tftp::tftp()
500{ 519{
501 length=0; 520 length=0;
502} 521}
503 522
504 523
505void CXferSocket::OnSend(int nErrorCode) 524void CXferSocket::OnSend(int nErrorCode)
506{ 525{
507 if(nErrorCode){ 526 if(nErrorCode){
508 ASSERT(m_Daddy); 527 ASSERT(m_Daddy);
509 m_Daddy->LogLine(IDS_LOG_XFERSEND); 528 m_Daddy->LogLine(IDS_LOG_XFERSEND);
510 return; 529 return;
511 } 530 }
512 if(!m_Queue.IsEmpty()){ 531 if(!m_Queue.IsEmpty()){
513 tftp *p = m_Queue.GetHead(); 532 tftp *p = m_Queue.GetHead();
514 ASSERT(p); 533 ASSERT(p);
515 m_Queue.RemoveHead(); 534 m_Queue.RemoveHead();
516 if(!p->Send(this,&m_Peer)){ 535 if(!p->Send(this,&m_Peer)){
517 ASSERT(m_Daddy); 536 ASSERT(m_Daddy);
518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); 537 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND);
519 } 538 }
520 delete p; 539 delete p;
521 } 540 }
522 DoSelect(); 541 DoSelect();
523 if(m_Queue.IsEmpty()){ 542 if(m_Queue.IsEmpty()){
524 switch(state){ 543 switch(state){
525 case stateDeny: 544 case stateDeny:
526 Destroy(FALSE); 545 Destroy(FALSE);
527 break; 546 break;
528 case stateFinish: 547 case stateFinish:
529 Destroy(TRUE); 548 Destroy(TRUE);
530 break; 549 break;
531 } 550 }
532 } 551 }
533} 552}
534 553
535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) 554BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr)
536{ 555{
537 ASSERT(socket); 556 ASSERT(socket);
538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); 557int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN));
539 if(rv!=length) 558 if(rv!=length)
540 return FALSE; 559 return FALSE;
541 return TRUE; 560 return TRUE;
542} 561}
543 562
544void CXferSocket::DoSelect() 563void CXferSocket::DoSelect()
545{ 564{
546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE) 565 if(m_Peer.sin_addr.s_addr!=INADDR_NONE)
547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); 566 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE));
548} 567}
549 568
550void CXferSocket::OnReceive(int nErrorCode) 569void CXferSocket::OnReceive(int nErrorCode)
551{ 570{
552 if(nErrorCode){ 571 if(nErrorCode){
553 ASSERT(m_Daddy); 572 ASSERT(m_Daddy);
554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); 573 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE);
555 return; 574 return;
556 } 575 }
557 ASSERT(m_Daddy); 576 ASSERT(m_Daddy);
558DWORD fionread = 0; 577DWORD fionread = 0;
559 VERIFY(IOCtl(FIONREAD,&fionread)); 578 VERIFY(IOCtl(FIONREAD,&fionread));
560tftp *p = tftp::Allocate(fionread); 579tftp *p = tftp::Allocate(fionread);
561 ASSERT(p); 580 ASSERT(p);
562SOCKADDR_IN sin; 581SOCKADDR_IN sin;
563 if(!p->Receive(this,fionread,&sin)){ 582 if(!p->Receive(this,fionread,&sin)){
564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); 583 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE);
565 delete p; 584 delete p;
566 }else 585 }else
567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){ 586 if(m_Peer.sin_addr.s_addr==INADDR_NONE){
568 m_Peer.sin_addr=sin.sin_addr; 587 m_Peer.sin_addr=sin.sin_addr;
569 m_Peer.sin_port=sin.sin_port; 588 m_Peer.sin_port=sin.sin_port;
570 } 589 }
571BOOL alive = TRUE; 590BOOL alive = TRUE;
572 if(state==stateInit){ 591 if(state==stateInit){
573 state=stateXfer; 592 state=stateXfer;
574 m_Peer.sin_port=sin.sin_port; 593 m_Peer.sin_port=sin.sin_port;
575 UpdateList(); 594 UpdateList();
576 } 595 }
577 if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){ 596 if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){
578 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID); 597 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID);
579 // *** Bounce it! 598 // *** Bounce it!
580 }else{ 599 }else{
581 alive = OnTFTP(p); 600 alive = OnTFTP(p);
582 } 601 }
583 delete p; 602 delete p;
584 if(alive){ 603 if(alive){
585 DoSelect(); 604 DoSelect();
586 ResetTimeout(); 605 ResetTimeout();
587 } 606 }
588} 607}
589 608
590void CXferSocket::SetPeer(SOCKADDR_IN *sin) 609void CXferSocket::SetPeer(SOCKADDR_IN *sin)
591{ 610{
592 ASSERT(sin); 611 ASSERT(sin);
593 memmove(&m_Peer,sin,sizeof(m_Peer)); 612 memmove(&m_Peer,sin,sizeof(m_Peer));
594} 613}
595 614
596void CXferSocket::UpdateList() 615void CXferSocket::UpdateList()
597{ 616{
598 ASSERT(m_Daddy); 617 ASSERT(m_Daddy);
599LV_FINDINFO lvf; 618LV_FINDINFO lvf;
600 memset(&lvf,0,sizeof(lvf)); 619 memset(&lvf,0,sizeof(lvf));
601 lvf.flags=LVFI_PARAM; 620 lvf.flags=LVFI_PARAM;
602 lvf.lParam=(LPARAM)this; 621 lvf.lParam=(LPARAM)this;
603int i = m_Daddy->m_List.FindItem(&lvf); 622int i = m_Daddy->m_List.FindItem(&lvf);
604 if(i<0){ 623 if(i<0){
605 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); 624 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket)));
606 i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ); 625 i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ);
607 ASSERT(!(i<0)); 626 ASSERT(!(i<0));
608 m_Daddy->m_List.SetItemData(i,(DWORD)this); 627 m_Daddy->m_List.SetItemData(i,(DWORD)this);
609 } 628 }
610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); 629 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName);
611 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); 630 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type);
612 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr)); 631 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr));
613CString tmp; 632CString tmp;
614 tmp.Format(IDS_FMT_BYTES,GetACK()); 633 tmp.Format(IDS_FMT_BYTES,GetACK());
615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); 634 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp);
616 if(m_xferSize>=0){ 635 if(m_xferSize>=0){
617 tmp.Format(IDS_FMT_BYTES,m_xferSize); 636 tmp.Format(IDS_FMT_BYTES,m_xferSize);
618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); 637 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp);
619 } 638 }
620} 639}
621 640
622CXferSocket::CXferSocket() 641CXferSocket::CXferSocket()
623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 642 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
624 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 643 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
625 m__blkSize(512), m__timeOut(30) 644 m__blkSize(512), m__timeOut(30)
626{ 645{
627 m_Daddy=NULL; 646 m_Daddy=NULL;
628 m_Peer.sin_addr.s_addr=INADDR_NONE; 647 m_Peer.sin_addr.s_addr=INADDR_NONE;
629 m_Peer.sin_family=AF_INET; 648 m_Peer.sin_family=AF_INET;
630 state=stateNone; 649 state=stateNone;
631} 650}
632 651
633ULONG CXferSocket::GetACK() 652ULONG CXferSocket::GetACK()
634{ 653{
635 return 0; 654 return 0;
636} 655}
637 656
638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) 657CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin)
639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 658 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
640 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 659 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
641 m__blkSize(512), m__timeOut(30) 660 m__blkSize(512), m__timeOut(30)
642{ 661{
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);
702 726
703 CString inAddr = hostName; 727 CString inAddr = hostName;
704 int at = inAddr.Find('@'); 728 int at = inAddr.Find('@');
705 if(at>=0) 729 if(at>=0)
706 inAddr=inAddr.Mid(at+1); 730 inAddr=inAddr.Mid(at+1);
707 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 731 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
708 ASSERT(!m_wndResolver); 732 ASSERT(!m_wndResolver);
709 m_wndResolver = new CResolver(this); 733 m_wndResolver = new CResolver(this);
710 ASSERT(m_wndResolver); 734 ASSERT(m_wndResolver);
711 return m_wndResolver->Resolve(); 735 return m_wndResolver->Resolve();
712 } 736 }
713 else 737 else
714 OnHostKnown(); 738 OnHostKnown();
715 }else{ 739 }else{
716 tftp::tftpOptions o; 740 tftp::tftpOptions o;
717 CString v; 741 CString v;
718 if(m_Options.Lookup(tftpoBSize,v)){ 742 if(m_Options.Lookup(tftpoBSize,v)){
719 m__blkSize=atoi(v); 743 m__blkSize=atoi(v);
720 if(m__blkSize){ 744 if(m__blkSize){
721 m_blkSize=m__blkSize; 745 m_blkSize=m__blkSize;
722 v.Format("%u",m_blkSize); 746 v.Format("%u",m_blkSize);
723 o[tftpoBSize]=v; 747 o[tftpoBSize]=v;
724 } 748 }
725 } 749 }
726 if(m_Options.Lookup(tftpoTSize,v)){ 750 if(m_Options.Lookup(tftpoTSize,v)){
727 v.Format("%lu",m_xferSize); 751 v.Format("%lu",m_xferSize);
728 o[tftpoTSize]=v; 752 o[tftpoTSize]=v;
729 } 753 }
730 if(m_Options.Lookup(tftpoTOut,v)){ 754 if(m_Options.Lookup(tftpoTOut,v)){
731 m__timeOut=atoi(v); 755 m__timeOut=atoi(v);
732 if(m__timeOut){ 756 if(m__timeOut){
733 m_timeOut=m__timeOut; 757 m_timeOut=m__timeOut;
734 v.Format("%u",m_timeOut); 758 v.Format("%u",m_timeOut);
735 o[tftpoTOut]=v; 759 o[tftpoTOut]=v;
736 } 760 }
737 } 761 }
738 state = stateXfer; 762 state = stateXfer;
739 m_ACK=0; 763 m_ACK=0;
740 if(o.GetCount()){ 764 if(o.GetCount()){
741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o)); 765 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o));
742 ASSERT(p); 766 ASSERT(p);
743 p->SetOpcode(tftp::opOACK); 767 p->SetOpcode(tftp::opOACK);
744 p->data.m_OACK.Set(&o); 768 p->data.m_OACK.Set(&o);
745 PostTFTP(p,TRUE); 769 PostTFTP(p,TRUE);
746 }else 770 }else
747 DoXfer(); 771 DoXfer();
748 } 772 }
749 return TRUE; 773 return TRUE;
750} 774}
751 775
752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 776CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
753 : CXferSocket(daddy,fileName,type,sin) 777 : CXferSocket(daddy,fileName,type,sin)
754{ 778{
755 m_ACK=0; 779 m_ACK=0;
756 m_LastSlack=0; 780 m_LastSlack=0;
757} 781}
758 782
759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg) 783UINT tftp::tftpERROR::tftpSize(LPCTSTR msg)
760{ 784{
761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1; 785 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1;
762} 786}
763 787
764tftp* tftp::Allocate(UINT tftpSize) 788tftp* tftp::Allocate(UINT tftpSize)
765{ 789{
766 ASSERT(tftpSize); 790 ASSERT(tftpSize);
767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize]; 791tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize];
768 ASSERT(rv); 792 ASSERT(rv);
769 rv->length=tftpSize; 793 rv->length=tftpSize;
770 return rv; 794 return rv;
771} 795}
772 796
773void tftp::errSet(UINT code,LPCTSTR msg) 797void tftp::errSet(UINT code,LPCTSTR msg)
774{ 798{
775 ASSERT(this); 799 ASSERT(this);
776 ASSERT(length>=data.m_ERROR.tftpSize(msg)); 800 ASSERT(length>=data.m_ERROR.tftpSize(msg));
777 strcpy((char*)data.m_ERROR.data,msg); 801 strcpy((char*)data.m_ERROR.data,msg);
778 data.m_ERROR.SetCode(code); 802 data.m_ERROR.SetCode(code);
779} 803}
780 804
781void CXferSocket::PostTFTP(tftp* p,BOOL retryable) 805void CXferSocket::PostTFTP(tftp* p,BOOL retryable)
782{ 806{
783 ASSERT(p); 807 ASSERT(p);
784 m_Queue.AddTail(p); 808 m_Queue.AddTail(p);
785 DoSelect(); 809 DoSelect();
786 if(!m_bRetry){ 810 if(!m_bRetry){
787 if(retryable) 811 if(retryable)
788 SetTry(p); 812 SetTry(p);
789 else 813 else
790 SetTry(); 814 SetTry();
791 } 815 }
792 ResetTimeout(); 816 ResetTimeout();
793} 817}
794 818
795void CXferSocket::Deny(UINT errCode,UINT errID) 819void CXferSocket::Deny(UINT errCode,UINT errID)
796{ 820{
797 PostError(errCode,errID); 821 PostError(errCode,errID);
798 state=stateDeny; 822 state=stateDeny;
799} 823}
800 824
801void CRRQSocket::DoXfer() 825void CRRQSocket::DoXfer()
802{ 826{
803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); 827tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
804 ASSERT(p); 828 ASSERT(p);
805 p->SetOpcode(tftp::opDATA); 829 p->SetOpcode(tftp::opDATA);
806 TRY{ 830 TRY{
807 m_File.Seek(m_ACK*m_blkSize,CFile::begin); 831 m_File.Seek(m_ACK*m_blkSize,CFile::begin);
808 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize); 832 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize);
809 p->data.m_DATA.SetBlock(m_ACK+1); 833 p->data.m_DATA.SetBlock(m_ACK+1);
810 p->length=p->length-m_blkSize+bytes; 834 p->length=p->length-m_blkSize+bytes;
811 m_LastSlack = m_blkSize-bytes; 835 m_LastSlack = m_blkSize-bytes;
812 PostTFTP(p); 836 PostTFTP(p);
813 if(bytes<m_blkSize){ 837 if(bytes<m_blkSize){
814 state=stateFinish; 838 state=stateFinish;
815 ASSERT(m_Daddy); 839 ASSERT(m_Daddy);
816 CString tmp; 840 CString tmp;
817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName); 841 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
818 m_Daddy->LogLine(tmp); 842 m_Daddy->LogLine(tmp);
819 } 843 }
820 }CATCH(CFileException,e){ 844 }CATCH(CFileException,e){
821 Deny(e); 845 Deny(e);
822 }END_CATCH 846 }END_CATCH
823} 847}
824 848
825UINT tftp::tftpDATA::tftpSize(UINT blkSize) 849UINT tftp::tftpDATA::tftpSize(UINT blkSize)
826{ 850{
827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA) 851 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
828 -sizeof(BYTE)+blkSize; 852 -sizeof(BYTE)+blkSize;
829} 853}
830 854
831void CXferSocket::Deny(CFileException* e) 855void CXferSocket::Deny(CFileException* e)
832{ 856{
833 PostError(e); 857 PostError(e);
834 state=stateDeny; 858 state=stateDeny;
835} 859}
836 860
837void CXferSocket::PostError(UINT errCode,UINT errID) 861void CXferSocket::PostError(UINT errCode,UINT errID)
838{ 862{
839CString msg; 863CString msg;
840 msg.LoadString(errID); 864 msg.LoadString(errID);
841 ASSERT(m_Daddy); 865 ASSERT(m_Daddy);
842 /*// *** 866 /*// ***
843CString tmp; 867CString tmp;
844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg); 868 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg);
845 m_Daddy->LogLine(tmp); 869 m_Daddy->LogLine(tmp);
846 */ 870 */
847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg)); 871tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg));
848err->SetOpcode(tftp::opERROR); 872err->SetOpcode(tftp::opERROR);
849 err->errSet(errCode,msg); 873 err->errSet(errCode,msg);
850 PostTFTP(err); 874 PostTFTP(err);
851} 875}
852 876
853void CXferSocket::PostError(CFileException* e) 877void CXferSocket::PostError(CFileException* e)
854{ 878{
855UINT eCode; 879UINT eCode;
856UINT eMsgID; 880UINT eMsgID;
857 switch(e->m_cause){ 881 switch(e->m_cause){
858 case CFileException::fileNotFound: 882 case CFileException::fileNotFound:
859 eCode=tftp::errNotFound; 883 eCode=tftp::errNotFound;
860 eMsgID=IDS_TFTP_ERROR_NOTFOUND; 884 eMsgID=IDS_TFTP_ERROR_NOTFOUND;
861 break; 885 break;
862 case CFileException::accessDenied: 886 case CFileException::accessDenied:
863 eCode=tftp::errAccessViolation; 887 eCode=tftp::errAccessViolation;
864 eMsgID=IDS_TFTP_ERROR_ACCESS; 888 eMsgID=IDS_TFTP_ERROR_ACCESS;
865 break; 889 break;
866 case CFileException::directoryFull: 890 case CFileException::directoryFull:
867 eCode=tftp::errDiskFull; 891 eCode=tftp::errDiskFull;
868 eMsgID=IDS_TFTP_ERROR_DIRFULL; 892 eMsgID=IDS_TFTP_ERROR_DIRFULL;
869 break; 893 break;
@@ -918,545 +942,559 @@ BOOL rv = TRUE;
918 if(o.Lookup(tftpoXResume,v)){ 942 if(o.Lookup(tftpoXResume,v)){
919 m_ACK=atoi(v); 943 m_ACK=atoi(v);
920 } 944 }
921 } 945 }
922 UpdateList(); 946 UpdateList();
923 DoXfer(); 947 DoXfer();
924 } 948 }
925 break; 949 break;
926 case tftp::opACK: 950 case tftp::opACK:
927 m_ACK=p->data.m_ACK.Block(); 951 m_ACK=p->data.m_ACK.Block();
928 if(state!=stateFinish){ 952 if(state!=stateFinish){
929 UpdateList(); 953 UpdateList();
930 DoXfer(); 954 DoXfer();
931 } 955 }
932 break; 956 break;
933 case tftp::opERROR: 957 case tftp::opERROR:
934 { 958 {
935 ASSERT(m_Daddy); 959 ASSERT(m_Daddy);
936 CString tmp; 960 CString tmp;
937 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 961 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
938 m_Daddy->LogLine(tmp); 962 m_Daddy->LogLine(tmp);
939 } 963 }
940 Destroy(FALSE); 964 Destroy(FALSE);
941 rv = FALSE; 965 rv = FALSE;
942 break; 966 break;
943 default: 967 default:
944 { 968 {
945 ASSERT(m_Daddy); 969 ASSERT(m_Daddy);
946 CString tmp; 970 CString tmp;
947 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); 971 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
948 m_Daddy->LogLine(tmp); 972 m_Daddy->LogLine(tmp);
949 // *** Self destruct maybe?? 973 // *** Self destruct maybe??
950 } 974 }
951 break; 975 break;
952 } 976 }
953 return rv; 977 return rv;
954} 978}
955 979
956BOOL CWRQSocket::OnTFTP(tftp* p) 980BOOL CWRQSocket::OnTFTP(tftp* p)
957{ 981{
958 switch(p->Opcode()){ 982 switch(p->Opcode()){
959 case tftp::opOACK: 983 case tftp::opOACK:
960 ASSERT(state!=stateFinish); 984 ASSERT(state!=stateFinish);
961 { 985 {
962 if(m_bResume) 986 if(m_bResume)
963 m_ACK=m_File.GetLength()/m_blkSize; 987 m_ACK=m_File.GetLength()/m_blkSize;
964 else 988 else
965 m_ACK=0; 989 m_ACK=0;
966 tftp::tftpOptions o; 990 tftp::tftpOptions o;
967 if(p->GetOptions(&o)){ 991 if(p->GetOptions(&o)){
968 CString v; 992 CString v;
969 if(o.Lookup(tftpoBSize,v)){ 993 if(o.Lookup(tftpoBSize,v)){
970 m_blkSize=atoi(v); 994 m_blkSize=atoi(v);
971 if(!m_blkSize){// *** More sanity checks 995 if(!m_blkSize){// *** More sanity checks
972 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 996 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
973 return TRUE; 997 return TRUE;
974 } 998 }
975 } 999 }
976 if(o.Lookup(tftpoTOut,v)){ 1000 if(o.Lookup(tftpoTOut,v)){
977 m_timeOut=atoi(v); 1001 m_timeOut=atoi(v);
978 if(!m_timeOut){// *** More sanity checks 1002 if(!m_timeOut){// *** More sanity checks
979 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 1003 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
980 return TRUE; 1004 return TRUE;
981 } 1005 }
982 } 1006 }
983 if(o.Lookup(tftpoTSize,v)){ 1007 if(o.Lookup(tftpoTSize,v)){
984 m_xferSize=atoi(v); 1008 m_xferSize=atoi(v);
985 } 1009 }
986 } 1010 }
987 UpdateList(); 1011 UpdateList();
988 DoXfer(); 1012 DoXfer();
989 } 1013 }
990 break; 1014 break;
991 case tftp::opDATA: 1015 case tftp::opDATA:
992 { 1016 {
993 UINTblock = p->data.m_DATA.Block(); 1017 UINTblock = p->data.m_DATA.Block();
994 TRY{ 1018 TRY{
995 m_File.Seek((block-1)*m_blkSize,CFile::begin); 1019 m_File.Seek((block-1)*m_blkSize,CFile::begin);
996 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); 1020 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize);
997 if(bytes){ 1021 if(bytes){
998 m_File.Write(p->data.m_DATA.data,bytes); 1022 m_File.Write(p->data.m_DATA.data,bytes);
999 // *** Move to the other place where we can do it not that often 1023 // *** Move to the other place where we can do it not that often
1000 m_File.SetLength(m_File.GetPosition()); 1024 m_File.SetLength(m_File.GetPosition());
1001 } 1025 }
1002 if(bytes<m_blkSize){ 1026 if(bytes<m_blkSize){
1003 state=stateFinish; 1027 state=stateFinish;
1004 ASSERT(m_Daddy); 1028 ASSERT(m_Daddy);
1005 CString tmp; 1029 CString tmp;
1006 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); 1030 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName);
1007 m_Daddy->LogLine(tmp); 1031 m_Daddy->LogLine(tmp);
1008 } 1032 }
1009 m_ACK=block; 1033 m_ACK=block;
1010 m_LastSlack=m_blkSize-bytes; 1034 m_LastSlack=m_blkSize-bytes;
1011 UpdateList(); 1035 UpdateList();
1012 DoXfer(); 1036 DoXfer();
1013 }CATCH(CFileException,e){ 1037 }CATCH(CFileException,e){
1014 Deny(e); 1038 Deny(e);
1015 }END_CATCH 1039 }END_CATCH
1016 } 1040 }
1017 break; 1041 break;
1018 case tftp::opERROR: 1042 case tftp::opERROR:
1019 { 1043 {
1020 ASSERT(m_Daddy); 1044 ASSERT(m_Daddy);
1021 CString tmp; 1045 CString tmp;
1022 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 1046 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
1023 m_Daddy->LogLine(tmp); 1047 m_Daddy->LogLine(tmp);
1024 } 1048 }
1025 Destroy(FALSE); 1049 Destroy(FALSE);
1026 return FALSE; 1050 return FALSE;
1027 default: 1051 default:
1028 { 1052 {
1029 ASSERT(m_Daddy); 1053 ASSERT(m_Daddy);
1030 CString tmp; 1054 CString tmp;
1031 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); 1055 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
1032 m_Daddy->LogLine(tmp); 1056 m_Daddy->LogLine(tmp);
1033 // *** Self destruct maybe?? 1057 // *** Self destruct maybe??
1034 } 1058 }
1035 break; 1059 break;
1036 } 1060 }
1037 return TRUE; 1061 return TRUE;
1038} 1062}
1039 1063
1040void tftp::SetOpcode(WORD op) 1064void tftp::SetOpcode(WORD op)
1041{ 1065{
1042 opcode = REVERSEBYTES(op); 1066 opcode = REVERSEBYTES(op);
1043} 1067}
1044void tftp::tftpDATA::SetBlock(WORD b) 1068void tftp::tftpDATA::SetBlock(WORD b)
1045{ 1069{
1046 block=REVERSEBYTES(b); 1070 block=REVERSEBYTES(b);
1047} 1071}
1048WORD tftp::tftpDATA::Block() 1072WORD tftp::tftpDATA::Block()
1049{ 1073{
1050 return REVERSEBYTES(block); 1074 return REVERSEBYTES(block);
1051} 1075}
1052WORD tftp::tftpACK::Block() 1076WORD tftp::tftpACK::Block()
1053{ 1077{
1054 return REVERSEBYTES(block); 1078 return REVERSEBYTES(block);
1055} 1079}
1056void tftp::tftpACK::SetBlock(WORD b) 1080void tftp::tftpACK::SetBlock(WORD b)
1057{ 1081{
1058 block = REVERSEBYTES(b); 1082 block = REVERSEBYTES(b);
1059} 1083}
1060WORD tftp::tftpERROR::Code() 1084WORD tftp::tftpERROR::Code()
1061{ 1085{
1062 return REVERSEBYTES(code); 1086 return REVERSEBYTES(code);
1063} 1087}
1064void tftp::tftpERROR::SetCode(WORD c) 1088void tftp::tftpERROR::SetCode(WORD c)
1065{ 1089{
1066 code = REVERSEBYTES(c); 1090 code = REVERSEBYTES(c);
1067} 1091}
1068 1092
1069 1093
1070CString tftp::errMessage() 1094CString tftp::errMessage()
1071{ 1095{
1072CString rv; 1096CString rv;
1073 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) 1097 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code)))
1074 rv = (LPCTSTR)data.m_ERROR.data; 1098 rv = (LPCTSTR)data.m_ERROR.data;
1075 return rv; 1099 return rv;
1076} 1100}
1077 1101
1078void CXferSocket::Destroy(BOOL success) 1102void CXferSocket::Destroy(BOOL success)
1079{ 1103{
1080 if(m_wndResolver){ 1104 if(m_wndResolver){
1081 delete m_wndResolver; 1105 delete m_wndResolver;
1082 m_wndResolver=NULL; 1106 m_wndResolver=NULL;
1083 } 1107 }
1084 SetTry(); 1108 SetTry();
1085 m_Daddy->m_bnw.StartSound( 1109 m_Daddy->m_bnw.StartSound(
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}
1135 1159
1136void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) 1160void CXferSocket::TurnSlashes(CString& fn,BOOL bBack)
1137{ 1161{
1138 ints = fn.Find(bBack?'/':'\\'); 1162 ints = fn.Find(bBack?'/':'\\');
1139 while(s>=0){ 1163 while(s>=0){
1140 fn.SetAt(s,bBack?'\\':'/'); 1164 fn.SetAt(s,bBack?'\\':'/');
1141 s = fn.Find(bBack?'/':'\\'); 1165 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){
1295 m_HostName=hostName; 1333 m_HostName=hostName;
1296 1334
1297 CString tmp; 1335 CString tmp;
1298 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); 1336 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName);
1299 m_Daddy->LogLine(tmp); 1337 m_Daddy->LogLine(tmp);
1300 1338
1301 CString inAddr = hostName; 1339 CString inAddr = hostName;
1302 int at = inAddr.Find('@'); 1340 int at = inAddr.Find('@');
1303 if(at>=0) 1341 if(at>=0)
1304 inAddr=inAddr.Mid(at+1); 1342 inAddr=inAddr.Mid(at+1);
1305 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 1343 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
1306 ASSERT(!m_wndResolver); 1344 ASSERT(!m_wndResolver);
1307 m_wndResolver = new CResolver(this); 1345 m_wndResolver = new CResolver(this);
1308 ASSERT(m_wndResolver); 1346 ASSERT(m_wndResolver);
1309 return m_wndResolver->Resolve(); 1347 return m_wndResolver->Resolve();
1310 }else{ 1348 }else{
1311 OnHostKnown(); 1349 OnHostKnown();
1312 return TRUE; 1350 return TRUE;
1313 } 1351 }
1314 } 1352 }
1315CString v; 1353CString v;
1316tftp::tftpOptions oack; 1354tftp::tftpOptions oack;
1317 if(m_Options.Lookup(tftpoTSize,v)){ 1355 if(m_Options.Lookup(tftpoTSize,v)){
1318 m_xferSize=atol(v); 1356 m_xferSize=atol(v);
1319 if(!m_xferSize){ 1357 if(!m_xferSize){
1320 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); 1358 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE);
1321 return TRUE; 1359 return TRUE;
1322 } 1360 }
1323 } 1361 }
1324 if(m_Options.Lookup(tftpoBSize,v)){ 1362 if(m_Options.Lookup(tftpoBSize,v)){
1325 m_blkSize=atoi(v); 1363 m_blkSize=atoi(v);
1326 if(!m_blkSize){// *** Do more about sanity check 1364 if(!m_blkSize){// *** Do more about sanity check
1327 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 1365 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
1328 return TRUE; 1366 return TRUE;
1329 } 1367 }
1330 v.Format("%u",m_blkSize); 1368 v.Format("%u",m_blkSize);
1331 oack[tftpoBSize]=v; 1369 oack[tftpoBSize]=v;
1332 } 1370 }
1333 if(m_Options.Lookup(tftpoTOut,v)){ 1371 if(m_Options.Lookup(tftpoTOut,v)){
1334 m_timeOut=atoi(v); 1372 m_timeOut=atoi(v);
1335 if(!m_timeOut){// *** Do more about sanity check 1373 if(!m_timeOut){// *** Do more about sanity check
1336 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 1374 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
1337 return TRUE; 1375 return TRUE;
1338 } 1376 }
1339 v.Format("%u",m_timeOut); 1377 v.Format("%u",m_timeOut);
1340 oack[tftpoTOut]=v; 1378 oack[tftpoTOut]=v;
1341 } 1379 }
1342 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ 1380 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){
1343 m_ACK=m_File.GetLength()/m_blkSize; 1381 m_ACK=m_File.GetLength()/m_blkSize;
1344 v.Format("%u",m_ACK); 1382 v.Format("%u",m_ACK);
1345 oack[tftpoXResume]=v; 1383 oack[tftpoXResume]=v;
1346 }else 1384 }else
1347 m_ACK=0; 1385 m_ACK=0;
1348 state=stateXfer; 1386 state=stateXfer;
1349 if(oack.GetCount()){ 1387 if(oack.GetCount()){
1350 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); 1388 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack));
1351 ASSERT(p); 1389 ASSERT(p);
1352 p->SetOpcode(tftp::opOACK); 1390 p->SetOpcode(tftp::opOACK);
1353 p->data.m_OACK.Set(&oack); 1391 p->data.m_OACK.Set(&oack);
1354 PostTFTP(p,TRUE); 1392 PostTFTP(p,TRUE);
1355 }else 1393 }else
1356 DoXfer(); 1394 DoXfer();
1357 return TRUE; 1395 return TRUE;
1358} 1396}
1359 1397
1360BOOL CWRQSocket::ConfirmRequest() 1398BOOL CWRQSocket::ConfirmRequest()
1361{ 1399{
1362CConfirmWRQDlg cd(NULL); 1400CConfirmWRQDlg cd(NULL);
1363 cd.m_Daddy=this; 1401 cd.m_Daddy=this;
1364 cd.m_File=m_FileName; 1402 cd.m_File=m_FileName;
1365 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1403 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1366 switch(cd.DoModal()){ 1404 switch(cd.DoModal()){
1367 case IDOK: 1405 case IDOK:
1368 m_Rename=FALSE; 1406 m_Rename=FALSE;
1369 m_bResume=FALSE; 1407 m_bResume=FALSE;
1370 return TRUE; 1408 return TRUE;
1371 case IDC_RENAME: 1409 case IDC_RENAME:
1372 m_bResume=FALSE; 1410 m_bResume=FALSE;
1373 m_Rename=TRUE; 1411 m_Rename=TRUE;
1374 return TRUE; 1412 return TRUE;
1375 case IDC_RESUME: 1413 case IDC_RESUME:
1376 m_Rename=FALSE; 1414 m_Rename=FALSE;
1377 m_bResume=TRUE; 1415 m_bResume=TRUE;
1378 return TRUE; 1416 return TRUE;
1379 case IDCANCEL: 1417 case IDCANCEL:
1380 return FALSE; 1418 return FALSE;
1381 } 1419 }
1382 return FALSE; 1420 return FALSE;
1383} 1421}
1384 1422
1385BOOL CWRQSocket::RenameFile(CString& fn) 1423BOOL CWRQSocket::RenameFile(CString& fn)
1386{ 1424{
1387CString renamed = fn; 1425CString renamed = fn;
1388 if(fn.IsEmpty()) 1426 if(fn.IsEmpty())
1389 return FALSE; 1427 return FALSE;
1390 if(fn[fn.GetLength()-1]==')'){ 1428 if(fn[fn.GetLength()-1]==')'){
1391 int op = fn.ReverseFind('('); 1429 int op = fn.ReverseFind('(');
1392 if(op>0 && fn[op-1]==' '){ 1430 if(op>0 && fn[op-1]==' '){
1393 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) 1431 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty())
1394 renamed = renamed.Left(op-1); 1432 renamed = renamed.Left(op-1);
1395 } 1433 }
1396 } 1434 }
1397CString testFN; 1435CString testFN;
1398 for(UINT tmp=0;tmp<32768;tmp++){ 1436 for(UINT tmp=0;tmp<32768;tmp++){
1399 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp); 1437 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp);
1400 if(!_access((LPCTSTR)testFN,0)) 1438 if(!_access((LPCTSTR)testFN,0))
1401 continue; 1439 continue;
1402 fn=testFN; 1440 fn=testFN;
1403 return TRUE; 1441 return TRUE;
1404 } 1442 }
1405 return FALSE; 1443 return FALSE;
1406} 1444}
1407 1445
1408BOOL CWRQSocket::SaveAs(CString& fn) 1446BOOL CWRQSocket::SaveAs(CString& fn)
1409{ 1447{
1410CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy); 1448CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy);
1411CString title; 1449CString title;
1412 title.LoadString(IDS_RENAME_TITLE); 1450 title.LoadString(IDS_RENAME_TITLE);
1413 cfd.m_ofn.lpstrTitle=(LPCTSTR)title; 1451 cfd.m_ofn.lpstrTitle=(LPCTSTR)title;
1414 if(cfd.DoModal()!=IDOK) 1452 if(cfd.DoModal()!=IDOK)
1415 return FALSE; 1453 return FALSE;
1416 fn = cfd.GetPathName(); 1454 fn = cfd.GetPathName();
1417 return TRUE; 1455 return TRUE;
1418} 1456}
1419 1457
1420void CWRQSocket::DoXfer() 1458void CWRQSocket::DoXfer()
1421{ 1459{
1422tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize()); 1460tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize());
1423 ASSERT(p); 1461 ASSERT(p);
1424 p->SetOpcode(tftp::opACK); 1462 p->SetOpcode(tftp::opACK);
1425 p->data.m_ACK.SetBlock(m_ACK); 1463 p->data.m_ACK.SetBlock(m_ACK);
1426 TRACE1("WRQ-ACK-%u\n",m_ACK); 1464 TRACE1("WRQ-ACK-%u\n",m_ACK);
1427 PostTFTP(p,TRUE);// *** ??? Hope this is right 1465 PostTFTP(p,TRUE);// *** ??? Hope this is right
1428} 1466}
1429 1467
1430UINT tftp::tftpACK::tftpSize() 1468UINT tftp::tftpACK::tftpSize()
1431{ 1469{
1432 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK); 1470 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK);
1433} 1471}
1434 1472
1435ULONG CWRQSocket::GetACK() 1473ULONG CWRQSocket::GetACK()
1436{ 1474{
1437 return (m_ACK*m_blkSize)-m_LastSlack; 1475 return (m_ACK*m_blkSize)-m_LastSlack;
1438} 1476}
1439 1477
1440void CXferSocket::ResetTimeout() 1478void CXferSocket::ResetTimeout()
1441{ 1479{
1442 ASSERT(m_Daddy); 1480 ASSERT(m_Daddy);
1443 m_Daddy->m_Retrier->KillTimer(m_hSocket); 1481 m_Daddy->m_Retrier->KillTimer(m_hSocket);
1444 if(m_Retry) 1482 if(m_Retry)
1445 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL); 1483 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL);
1446 if(!m_bRetry){ 1484 if(!m_bRetry){
1447 m_Daddy->KillTimer(m_hSocket); 1485 m_Daddy->KillTimer(m_hSocket);
1448 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL); 1486 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL);
1449 } 1487 }
1450} 1488}
1451 1489
1452void CXferSocket::Abort() 1490void CXferSocket::Abort()
1453{ 1491{
1454 ASSERT(m_Daddy); 1492 ASSERT(m_Daddy);
1455CString tmp; 1493CString tmp;
1456 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName); 1494 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName);
1457 m_Daddy->LogLine(tmp); 1495 m_Daddy->LogLine(tmp);
1458 Destroy(FALSE); 1496 Destroy(FALSE);
1459} 1497}
1460 1498
1461void CPumpKINDlg::OnTimer(UINT nIDEvent) 1499void CPumpKINDlg::OnTimer(UINT nIDEvent)
1462{ 1500{
@@ -1606,381 +1644,436 @@ tftp *p = tftp::Allocate(tftp::tftpWRQ::tftpSize(m_FileName,m_Type,&o));
1606 ASSERT(p); 1644 ASSERT(p);
1607 p->SetOpcode(tftp::opWRQ); 1645 p->SetOpcode(tftp::opWRQ);
1608 p->data.m_WRQ.Set(m_FileName,m_Type,&o); 1646 p->data.m_WRQ.Set(m_FileName,m_Type,&o);
1609 PostTFTP(p,TRUE); 1647 PostTFTP(p,TRUE);
1610 state=stateInit; 1648 state=stateInit;
1611 UpdateList(); 1649 UpdateList();
1612} 1650}
1613 1651
1614UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1652UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1615{ 1653{
1616UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1; 1654UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1;
1617 if(ops){ 1655 if(ops){
1618 tftpOptions& o = *ops; 1656 tftpOptions& o = *ops;
1619 POSITION p = o.GetStartPosition(); 1657 POSITION p = o.GetStartPosition();
1620 while(p){ 1658 while(p){
1621 CString n,v; 1659 CString n,v;
1622 o.GetNextAssoc(p,n,v); 1660 o.GetNextAssoc(p,n,v);
1623 rv+=n.GetLength()+1+v.GetLength()+1; 1661 rv+=n.GetLength()+1+v.GetLength()+1;
1624 } 1662 }
1625 } 1663 }
1626 return rv; 1664 return rv;
1627} 1665}
1628UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1666UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1629{ 1667{
1630 return tftp::tftpRQ::tftpSize(file,type,ops); 1668 return tftp::tftpRQ::tftpSize(file,type,ops);
1631} 1669}
1632UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1670UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1633{ 1671{
1634 return tftp::tftpRQ::tftpSize(file,type,ops); 1672 return tftp::tftpRQ::tftpSize(file,type,ops);
1635} 1673}
1636UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops) 1674UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops)
1637{ 1675{
1638UINT rv = tftpHdrSize-tftpSlackSize; 1676UINT rv = tftpHdrSize-tftpSlackSize;
1639 if(ops){ 1677 if(ops){
1640 tftpOptions& o = *ops; 1678 tftpOptions& o = *ops;
1641 POSITION p = o.GetStartPosition(); 1679 POSITION p = o.GetStartPosition();
1642 while(p){ 1680 while(p){
1643 CString n,v; 1681 CString n,v;
1644 o.GetNextAssoc(p,n,v); 1682 o.GetNextAssoc(p,n,v);
1645 rv+=n.GetLength()+1+v.GetLength()+1; 1683 rv+=n.GetLength()+1+v.GetLength()+1;
1646 } 1684 }
1647 } 1685 }
1648 return rv; 1686 return rv;
1649} 1687}
1650void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1688void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1651{ 1689{
1652 // MAY BE DANGEROUS! 1690 // MAY BE DANGEROUS!
1653UINT ptr = 0; 1691UINT ptr = 0;
1654 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1692 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1655 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1693 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1656 if(ops){ 1694 if(ops){
1657 tftpOptions& o = *ops; 1695 tftpOptions& o = *ops;
1658 POSITION p = o.GetStartPosition(); 1696 POSITION p = o.GetStartPosition();
1659 while(p){ 1697 while(p){
1660 CString n,v; 1698 CString n,v;
1661 o.GetNextAssoc(p,n,v); 1699 o.GetNextAssoc(p,n,v);
1662 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1700 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1663 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1701 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1664 } 1702 }
1665 } 1703 }
1666} 1704}
1667void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1705void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1668{ 1706{
1669 // MAY BE DANGEROUS! 1707 // MAY BE DANGEROUS!
1670UINT ptr = 0; 1708UINT ptr = 0;
1671 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1709 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1672 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1710 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1673 if(ops){ 1711 if(ops){
1674 tftpOptions& o = *ops; 1712 tftpOptions& o = *ops;
1675 POSITION p = o.GetStartPosition(); 1713 POSITION p = o.GetStartPosition();
1676 while(p){ 1714 while(p){
1677 CString n,v; 1715 CString n,v;
1678 o.GetNextAssoc(p,n,v); 1716 o.GetNextAssoc(p,n,v);
1679 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1717 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1680 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1718 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1681 } 1719 }
1682 } 1720 }
1683} 1721}
1684void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1722void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1685{ 1723{
1686 // MAY BE DANGEROUS! 1724 // MAY BE DANGEROUS!
1687UINT ptr = 0; 1725UINT ptr = 0;
1688 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1726 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1689 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1727 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1690 if(ops){ 1728 if(ops){
1691 tftpOptions& o = *ops; 1729 tftpOptions& o = *ops;
1692 POSITION p = o.GetStartPosition(); 1730 POSITION p = o.GetStartPosition();
1693 while(p){ 1731 while(p){
1694 CString n,v; 1732 CString n,v;
1695 o.GetNextAssoc(p,n,v); 1733 o.GetNextAssoc(p,n,v);
1696 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1734 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1697 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1735 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1698 } 1736 }
1699 } 1737 }
1700} 1738}
1701void tftp::tftpOACK::Set(tftpOptions* ops) 1739void tftp::tftpOACK::Set(tftpOptions* ops)
1702{ 1740{
1703 ASSERT(ops); 1741 ASSERT(ops);
1704UINT ptr = 0; 1742UINT ptr = 0;
1705tftpOptions& o = *ops; 1743tftpOptions& o = *ops;
1706POSITION p = o.GetStartPosition(); 1744POSITION p = o.GetStartPosition();
1707 while(p){ 1745 while(p){
1708 CString n,v; 1746 CString n,v;
1709 o.GetNextAssoc(p,n,v); 1747 o.GetNextAssoc(p,n,v);
1710 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1748 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1711 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1749 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1712 } 1750 }
1713} 1751}
1714 1752
1715void CWRQSocket::OnResolved() 1753void CWRQSocket::OnResolved()
1716{ 1754{
1717 CXferSocket::OnResolved(); 1755 CXferSocket::OnResolved();
1718 OnHostKnown(); 1756 OnHostKnown();
1719} 1757}
1720 1758
1721void CWRQSocket::OnHostKnown() 1759void CWRQSocket::OnHostKnown()
1722{ 1760{
1723 ASSERT(m_Daddy); 1761 ASSERT(m_Daddy);
1724 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort); 1762 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort);
1725tftp::tftpOptions o; 1763tftp::tftpOptions o;
1726CString v; 1764CString v;
1727 o[tftpoTSize]="0"; 1765 o[tftpoTSize]="0";
1728 if(m__blkSize){ 1766 if(m__blkSize){
1729 v.Format("%u",m__blkSize); 1767 v.Format("%u",m__blkSize);
1730 o[tftpoBSize]=v; 1768 o[tftpoBSize]=v;
1731 } 1769 }
1732 if(m__timeOut){ 1770 if(m__timeOut){
1733 v.Format("%u",m__timeOut); 1771 v.Format("%u",m__timeOut);
1734 o[tftpoTOut]=v; 1772 o[tftpoTOut]=v;
1735 } 1773 }
1736 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o)); 1774 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o));
1737 ASSERT(p); 1775 ASSERT(p);
1738 p->SetOpcode(tftp::opRRQ); 1776 p->SetOpcode(tftp::opRRQ);
1739 p->data.m_RRQ.Set(m_FileName,m_Type,&o); 1777 p->data.m_RRQ.Set(m_FileName,m_Type,&o);
1740 PostTFTP(p,TRUE); 1778 PostTFTP(p,TRUE);
1741 state=stateInit; 1779 state=stateInit;
1742 UpdateList(); 1780 UpdateList();
1743} 1781}
1744 1782
1745void CPumpKINDlg::OnClose() 1783void CPumpKINDlg::OnClose()
1746{ 1784{
1747 OnTrayShowpumpkinwindow(); 1785 OnTrayShowpumpkinwindow();
1748} 1786}
1749 1787
1750void CPumpKINDlg::OnTrayShowpumpkinwindow() 1788void CPumpKINDlg::OnTrayShowpumpkinwindow()
1751{ 1789{
1752 if(IsWindowVisible()){ 1790 if(IsWindowVisible()){
1753 m_bShown=FALSE; 1791 m_bShown=FALSE;
1754 ShowWindow(SW_HIDE); 1792 ShowWindow(SW_HIDE);
1755 }else{ 1793 }else{
1756 m_bShown=TRUE; 1794 m_bShown=TRUE;
1757 ShowWindow(SW_SHOW); 1795 ShowWindow(SW_SHOW);
1758 SetForegroundWindow(); 1796 SetForegroundWindow();
1759 SetFocus(); 1797 SetFocus();
1760 } 1798 }
1761} 1799}
1762 1800
1763void CPumpKINDlg::OnTrayExit() 1801void CPumpKINDlg::OnTrayExit()
1764{ 1802{
1765 OnExit(); 1803 OnExit();
1766} 1804}
1767 1805
1768void CPumpKINDlg::OnTrayAboutpumpkin() 1806void CPumpKINDlg::OnTrayAboutpumpkin()
1769{ 1807{
1770CAboutDlg dlgAbout; 1808CAboutDlg dlgAbout;
1771 dlgAbout.DoModal(); 1809 dlgAbout.DoModal();
1772} 1810}
1773 1811
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);
1864 return rv; 1908 return rv;
1865} 1909}
1866 1910
1867BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file) 1911BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file)
1868{ 1912{
1869CString tmp = file; 1913CString tmp = file;
1870 if(tmp.IsEmpty()) 1914 if(tmp.IsEmpty())
1871 return FALSE; 1915 return FALSE;
1872 if(tmp.Find("..")>=0) 1916 if(tmp.Find("..")>=0)
1873 return TRUE; 1917 return TRUE;
1874 if(tmp.Find(":")>=0) 1918 if(tmp.Find(":")>=0)
1875 return TRUE; 1919 return TRUE;
1876 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0) 1920 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0)
1877 return TRUE; 1921 return TRUE;
1878 return FALSE; 1922 return FALSE;
1879} 1923}
1880 1924
1881void CAboutDlg::OnKlevernet() 1925void CAboutDlg::OnKlevernet()
1882{ 1926{
1883CString url; 1927CString url;
1884 url.LoadString(IDS_KLEVERNET_URL); 1928 url.LoadString(IDS_KLEVERNET_URL);
1885 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED); 1929 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED);
1886} 1930}
1887 1931
1888BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg) 1932BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg)
1889{ 1933{
1890 // CG: The following block was added by the ToolTips component. 1934 // CG: The following block was added by the ToolTips component.
1891 { 1935 {
1892 // Let the ToolTip process this message. 1936 // Let the ToolTip process this message.
1893 m_tooltip.RelayEvent(pMsg); 1937 m_tooltip.RelayEvent(pMsg);
1894 1938
1895 return CDialog::PreTranslateMessage(pMsg); 1939 return CDialog::PreTranslateMessage(pMsg);
1896 } 1940 }
1897} 1941}
1898 1942
1899void CPumpKINDlg::OnSelchangeLog() 1943void CPumpKINDlg::OnSelchangeLog()
1900{ 1944{
1901int sel = m_Log.GetCurSel(); 1945int sel = m_Log.GetCurSel();
1902 if(sel==LB_ERR){ 1946 if(sel==LB_ERR){
1903 TRACE0("Error retrieving selection\n"); 1947 TRACE0("Error retrieving selection\n");
1904 }else{ 1948 }else{
1905 CTime *t = (CTime*)m_Log.GetItemData(sel); 1949 CTime *t = (CTime*)m_Log.GetItemData(sel);
1906 ASSERT(t); 1950 ASSERT(t);
1907 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log); 1951 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log);
1908 } 1952 }
1909} 1953}
1910 1954
1911void CPumpKINDlg::OnTrayOpenfilesfolder() 1955void CPumpKINDlg::OnTrayOpenfilesfolder()
1912{ 1956{
1913 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT); 1957 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT);
1914} 1958}
1915 1959
1916void CPumpKINDlg::OnDropFiles(HDROP hDropInfo) 1960void CPumpKINDlg::OnDropFiles(HDROP hDropInfo)
1917{ 1961{
1918UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); 1962UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
1919 ASSERT(files); 1963 ASSERT(files);
1920 for(UINT file=0;file<files;file++){ 1964 for(UINT file=0;file<files;file++){
1921 CString theFile; 1965 CString theFile;
1922 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0); 1966 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0);
1923 ASSERT(fileNameLength); 1967 ASSERT(fileNameLength);
1924 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength); 1968 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength);
1925 theFile.ReleaseBuffer(); 1969 theFile.ReleaseBuffer();
1926 // Send it over! 1970 // Send it over!
1927 CRequestDlg crd(NULL); 1971 CRequestDlg crd(NULL);
1928 crd.m_Drop=TRUE; 1972 crd.m_Drop=TRUE;
1929 crd.m_Put=TRUE; 1973 crd.m_Put=TRUE;
1930 crd.m_BSize=m_BlockSize; 1974 crd.m_BSize=m_BlockSize;
1931 crd.m_LocalFile=theFile; 1975 crd.m_LocalFile=theFile;
1932 if(crd.DoModal()==IDOK){ 1976 if(crd.DoModal()==IDOK){
1933 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1977 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1934 if(crd.m_BSize) 1978 if(crd.m_BSize)
1935 socket->m__blkSize=crd.m_BSize; 1979 socket->m__blkSize=crd.m_BSize;
1936 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1980 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1937 socket->Destroy(); 1981 socket->Destroy();
1938 } 1982 }
1939 } 1983 }
1940 ::DragFinish(hDropInfo); 1984 ::DragFinish(hDropInfo);
1941} 1985}
1942 1986
1943void CPumpKINDlg::OnCancel() 1987void CPumpKINDlg::OnCancel()
1944{ 1988{
1945 OnClose(); 1989 OnClose();
1946} 1990}
1947 1991
1948CPumpKINDlg::~CPumpKINDlg() 1992CPumpKINDlg::~CPumpKINDlg()
1949{ 1993{
1950 delete m_Trayer; 1994 delete m_Trayer;
1951 delete m_Retrier; 1995 delete m_Retrier;
1952} 1996}
1953 1997
1954void CXferSocket::OnRetry() 1998void CXferSocket::OnRetry()
1955{ 1999{
1956 if(!m_Retry){ 2000 if(!m_Retry){
1957 TRACE("Retrying unretriable..\n"); 2001 TRACE("Retrying unretriable..\n");
1958 return; 2002 return;
1959 } 2003 }
1960 TRACE0("Retrying..\n"); 2004 TRACE0("Retrying..\n");
1961 m_bRetry=TRUE; 2005 m_bRetry=TRUE;
1962 PostTFTP(tftp::Copy(m_Retry)); 2006 PostTFTP(tftp::Copy(m_Retry));
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}