summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--PumpKINDlg.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index fc24596..b6b8a36 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -1,1978 +1,1986 @@
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 "PropsServer.h" 8#include "PropsServer.h"
9#include "PropsNetwork.h" 9#include "PropsNetwork.h"
10#include "PropsSounds.h" 10#include "PropsSounds.h"
11#include "ConfirmRRQDlg.h" 11#include "ConfirmRRQDlg.h"
12#include "ConfirmWRQDlg.h" 12#include "ConfirmWRQDlg.h"
13#include "RequestDlg.h" 13#include "RequestDlg.h"
14#include "Resolver.h" 14#include "Resolver.h"
15#include "Retrier.h" 15#include "Retrier.h"
16#include "Trayer.h" 16#include "Trayer.h"
17 17
18#include <io.h> 18#include <io.h>
19 19
20#ifdef _DEBUG 20#ifdef _DEBUG
21#define new DEBUG_NEW 21#define new DEBUG_NEW
22#undef THIS_FILE 22#undef THIS_FILE
23static char THIS_FILE[] = __FILE__; 23static char THIS_FILE[] = __FILE__;
24#endif 24#endif
25 25
26IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket) 26IMPLEMENT_DYNAMIC(CXferSocket, CAsyncSocket)
27IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket) 27IMPLEMENT_DYNAMIC(CWRQSocket, CXferSocket)
28IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket) 28IMPLEMENT_DYNAMIC(CRRQSocket, CXferSocket)
29 29
30///////////////////////////////////////////////////////////////////////////// 30/////////////////////////////////////////////////////////////////////////////
31// CAboutDlg dialog used for App About 31// CAboutDlg dialog used for App About
32 32
33class CAboutDlg : public CDialog 33class CAboutDlg : public CDialog
34{ 34{
35public: 35public:
36 CAboutDlg(); 36 CAboutDlg();
37 37
38// Dialog Data 38// Dialog Data
39 //{{AFX_DATA(CAboutDlg) 39 //{{AFX_DATA(CAboutDlg)
40 enum { IDD = IDD_ABOUTBOX }; 40 enum { IDD = IDD_ABOUTBOX };
41 //}}AFX_DATA 41 //}}AFX_DATA
42 42
43 // ClassWizard generated virtual function overrides 43 // ClassWizard generated virtual function overrides
44 //{{AFX_VIRTUAL(CAboutDlg) 44 //{{AFX_VIRTUAL(CAboutDlg)
45 protected: 45 protected:
46 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 46 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
47 //}}AFX_VIRTUAL 47 //}}AFX_VIRTUAL
48 48
49// Implementation 49// Implementation
50protected: 50protected:
51 //{{AFX_MSG(CAboutDlg) 51 //{{AFX_MSG(CAboutDlg)
52 afx_msg void OnKlevernet(); 52 afx_msg void OnKlevernet();
53 //}}AFX_MSG 53 //}}AFX_MSG
54 DECLARE_MESSAGE_MAP() 54 DECLARE_MESSAGE_MAP()
55}; 55};
56 56
57CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 57CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
58{ 58{
59 //{{AFX_DATA_INIT(CAboutDlg) 59 //{{AFX_DATA_INIT(CAboutDlg)
60 //}}AFX_DATA_INIT 60 //}}AFX_DATA_INIT
61} 61}
62 62
63void CAboutDlg::DoDataExchange(CDataExchange* pDX) 63void CAboutDlg::DoDataExchange(CDataExchange* pDX)
64{ 64{
65 CDialog::DoDataExchange(pDX); 65 CDialog::DoDataExchange(pDX);
66 //{{AFX_DATA_MAP(CAboutDlg) 66 //{{AFX_DATA_MAP(CAboutDlg)
67 //}}AFX_DATA_MAP 67 //}}AFX_DATA_MAP
68} 68}
69 69
70BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 70BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
71 //{{AFX_MSG_MAP(CAboutDlg) 71 //{{AFX_MSG_MAP(CAboutDlg)
72 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) 72 ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet)
73 //}}AFX_MSG_MAP 73 //}}AFX_MSG_MAP
74END_MESSAGE_MAP() 74END_MESSAGE_MAP()
75 75
76///////////////////////////////////////////////////////////////////////////// 76/////////////////////////////////////////////////////////////////////////////
77// CPumpKINDlg dialog 77// CPumpKINDlg dialog
78 78
79CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) 79CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/)
80 : CDialog(CPumpKINDlg::IDD, pParent) 80 : CDialog(CPumpKINDlg::IDD, pParent)
81{ 81{
82 m_ListenPort = 69; 82 m_ListenPort = 69;
83 m_bTFTPSubdirs = TRUE; 83 m_bTFTPSubdirs = TRUE;
84 m_RRQMode = rrqAlwaysConfirm; 84 m_RRQMode = rrqAlwaysConfirm;
85 m_WRQMode = wrqAlwaysConfirm; 85 m_WRQMode = wrqAlwaysConfirm;
86 m_TFTPTimeOut = CTimeSpan(0,0,0,30); 86 m_TFTPTimeOut = CTimeSpan(0,0,0,30);
87 m_RetryTimeOut = CTimeSpan(0,0,0,10); 87 m_RetryTimeOut = CTimeSpan(0,0,0,10);
88 m_LogLength = 100; 88 m_LogLength = 100;
89 m_SpeakPort = 69; 89 m_SpeakPort = 69;
90 m_PromptTimeOut=30; 90 m_PromptTimeOut=30;
91 m_bShown=TRUE; 91 m_bShown=TRUE;
92 m_bExiting=FALSE; 92 m_bExiting=FALSE;
93 m_BlockSize=1024; 93 m_BlockSize=1024;
94 m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); 94 m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource);
95 m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); 95 m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource);
96 m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); 96 m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource);
97 m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); 97 m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone);
98 m_bnwRequest="(bang)"; m_bnwSuccess="(done)"; 98 m_bnwRequest="(bang)"; m_bnwSuccess="(done)";
99 m_bnwAbort="(oops)"; 99 m_bnwAbort="(oops)";
100 //{{AFX_DATA_INIT(CPumpKINDlg) 100 //{{AFX_DATA_INIT(CPumpKINDlg)
101 //}}AFX_DATA_INIT 101 //}}AFX_DATA_INIT
102 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 102 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
103 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 103 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
104 m_bmpBack.LoadBitmap(IDB_BACKGROUND); 104 m_bmpBack.LoadBitmap(IDB_BACKGROUND);
105 m_bmpBack.GetBitmap(&m_bitmapBack); 105 m_bmpBack.GetBitmap(&m_bitmapBack);
106 m_Retrier = new CRetrier(this); 106 m_Retrier = new CRetrier(this);
107 ASSERT(m_Retrier); 107 ASSERT(m_Retrier);
108 m_Trayer = new CTrayer(this); 108 m_Trayer = new CTrayer(this);
109 ASSERT(m_Trayer); 109 ASSERT(m_Trayer);
110 LoadSettings(); 110 LoadSettings();
111} 111}
112 112
113void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) 113void CPumpKINDlg::DoDataExchange(CDataExchange* pDX)
114{ 114{
115 CDialog::DoDataExchange(pDX); 115 CDialog::DoDataExchange(pDX);
116 //{{AFX_DATA_MAP(CPumpKINDlg) 116 //{{AFX_DATA_MAP(CPumpKINDlg)
117 DDX_Control(pDX, IDC_ABORT, m_AbortCtl); 117 DDX_Control(pDX, IDC_ABORT, m_AbortCtl);
118 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); 118 DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl);
119 DDX_Control(pDX, IDC_LOG, m_Log); 119 DDX_Control(pDX, IDC_LOG, m_Log);
120 DDX_Control(pDX, IDC_CONNECTIONS, m_List); 120 DDX_Control(pDX, IDC_CONNECTIONS, m_List);
121 //}}AFX_DATA_MAP 121 //}}AFX_DATA_MAP
122} 122}
123 123
124BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) 124BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog)
125 //{{AFX_MSG_MAP(CPumpKINDlg) 125 //{{AFX_MSG_MAP(CPumpKINDlg)
126 ON_WM_SYSCOMMAND() 126 ON_WM_SYSCOMMAND()
127 ON_WM_DESTROY() 127 ON_WM_DESTROY()
128 ON_WM_PAINT() 128 ON_WM_PAINT()
129 ON_WM_QUERYDRAGICON() 129 ON_WM_QUERYDRAGICON()
130 ON_WM_CREATE() 130 ON_WM_CREATE()
131 ON_BN_CLICKED(IDC_OPTIONS, OnOptions) 131 ON_BN_CLICKED(IDC_OPTIONS, OnOptions)
132 ON_WM_TIMER() 132 ON_WM_TIMER()
133 ON_BN_CLICKED(IDC_EXIT, OnExit) 133 ON_BN_CLICKED(IDC_EXIT, OnExit)
134 ON_BN_CLICKED(IDC_PUT, OnPut) 134 ON_BN_CLICKED(IDC_PUT, OnPut)
135 ON_BN_CLICKED(IDC_GET, OnGet) 135 ON_BN_CLICKED(IDC_GET, OnGet)
136 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections) 136 ON_NOTIFY(LVN_DELETEALLITEMS, IDC_CONNECTIONS, OnDeleteallitemsConnections)
137 ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections) 137 ON_NOTIFY(LVN_DELETEITEM, IDC_CONNECTIONS, OnDeleteitemConnections)
138 ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections) 138 ON_NOTIFY(LVN_INSERTITEM, IDC_CONNECTIONS, OnInsertitemConnections)
139 ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections) 139 ON_NOTIFY(LVN_ITEMCHANGED, IDC_CONNECTIONS, OnItemchangedConnections)
140 ON_BN_CLICKED(IDC_ABORT, OnAbort) 140 ON_BN_CLICKED(IDC_ABORT, OnAbort)
141 ON_WM_CLOSE() 141 ON_WM_CLOSE()
142 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow) 142 ON_COMMAND(ID_TRAY_SHOWPUMPKINWINDOW, OnTrayShowpumpkinwindow)
143 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit) 143 ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
144 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin) 144 ON_COMMAND(ID_TRAY_ABOUTPUMPKIN, OnTrayAboutpumpkin)
145 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile) 145 ON_COMMAND(ID_TRAY_FETCHFILE, OnTrayFetchfile)
146 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp) 146 ON_COMMAND(ID_TRAY_HELP, OnTrayHelp)
147 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions) 147 ON_COMMAND(ID_TRAY_OPTIONS, OnTrayOptions)
148 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile) 148 ON_COMMAND(ID_TRAY_SENDFILE, OnTraySendfile)
149 ON_WM_WINDOWPOSCHANGING() 149 ON_WM_WINDOWPOSCHANGING()
150 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog) 150 ON_LBN_SELCHANGE(IDC_LOG, OnSelchangeLog)
151 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder) 151 ON_COMMAND(ID_TRAY_OPENFILESFOLDER, OnTrayOpenfilesfolder)
152 ON_WM_DROPFILES() 152 ON_WM_DROPFILES()
153 ON_BN_CLICKED(ID_HELP, OnHelp) 153 ON_BN_CLICKED(ID_HELP, OnHelp)
154 //}}AFX_MSG_MAP 154 //}}AFX_MSG_MAP
155END_MESSAGE_MAP() 155END_MESSAGE_MAP()
156 156
157///////////////////////////////////////////////////////////////////////////// 157/////////////////////////////////////////////////////////////////////////////
158// CPumpKINDlg message handlers 158// CPumpKINDlg message handlers
159 159
160BOOL CPumpKINDlg::OnInitDialog() 160BOOL CPumpKINDlg::OnInitDialog()
161{ 161{
162 CDialog::OnInitDialog(); 162 CDialog::OnInitDialog();
163 163
164 // Add "About..." menu item to system menu. 164 // Add "About..." menu item to system menu.
165 165
166 // IDM_ABOUTBOX must be in the system command range. 166 // IDM_ABOUTBOX must be in the system command range.
167 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 167 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
168 ASSERT(IDM_ABOUTBOX < 0xF000); 168 ASSERT(IDM_ABOUTBOX < 0xF000);
169 169
170 CMenu* pSysMenu = GetSystemMenu(FALSE); 170 CMenu* pSysMenu = GetSystemMenu(FALSE);
171 CString strAboutMenu; 171 CString strAboutMenu;
172 strAboutMenu.LoadString(IDS_ABOUTBOX); 172 strAboutMenu.LoadString(IDS_ABOUTBOX);
173 if (!strAboutMenu.IsEmpty()) 173 if (!strAboutMenu.IsEmpty())
174 { 174 {
175 pSysMenu->AppendMenu(MF_SEPARATOR); 175 pSysMenu->AppendMenu(MF_SEPARATOR);
176 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 176 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
177 } 177 }
178 178
179 // Set the icon for this dialog. The framework does this automatically 179 // Set the icon for this dialog. The framework does this automatically
180 // when the application's main window is not a dialog 180 // when the application's main window is not a dialog
181 SetIcon(m_hIcon, TRUE); // Set big icon 181 SetIcon(m_hIcon, TRUE); // Set big icon
182 SetIcon(m_hIcon, FALSE); // Set small icon 182 SetIcon(m_hIcon, FALSE); // Set small icon
183 183
184 VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0)); 184 VERIFY(m_Retrier->Create(NULL,"PumpKIN-Retrier",WS_CHILD,CRect(0,0,0,0),this,0));
185 185
186 186
187 m_Images.Create(16,16,TRUE,2,1); 187 m_Images.Create(16,16,TRUE,2,1);
188 m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ)); 188 m_iRRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_RRQ));
189 m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ)); 189 m_iWRQ = m_Images.Add(AfxGetApp()->LoadIcon(IDI_WRQ));
190 ASSERT(m_iRRQ>=0); 190 ASSERT(m_iRRQ>=0);
191 ASSERT(m_iWRQ>=0); 191 ASSERT(m_iWRQ>=0);
192 m_List.SetImageList(&m_Images,LVSIL_NORMAL); 192 m_List.SetImageList(&m_Images,LVSIL_NORMAL);
193 m_List.SetImageList(&m_Images,LVSIL_SMALL); 193 m_List.SetImageList(&m_Images,LVSIL_SMALL);
194 m_List.SetImageList(&m_Images,LVSIL_STATE); 194 m_List.SetImageList(&m_Images,LVSIL_STATE);
195 m_List.SetTextColor(RGB(255,255,0));// Yellow 195 m_List.SetTextColor(RGB(255,255,0));// Yellow
196 m_List.SetTextBkColor(RGB(12,167,0));// Green 196 m_List.SetTextBkColor(RGB(12,167,0));// Green
197 m_List.SetBkColor(RGB(12,167,0));// Green 197 m_List.SetBkColor(RGB(12,167,0));// Green
198CRect listrc; 198CRect listrc;
199 m_List.GetClientRect(&listrc); 199 m_List.GetClientRect(&listrc);
200 m_List.InsertColumn(0,"File",LVCFMT_LEFT,listrc.Width()-((listrc.Width()/7)*3+listrc.Width()*2/7),subitemFile); 200 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); 201 m_List.InsertColumn(1,"type",LVCFMT_CENTER,listrc.Width()/7,subitemType);
202 m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer); 202 m_List.InsertColumn(2,"peer",LVCFMT_LEFT,listrc.Width()*2/7,subitemPeer);
203 m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes); 203 m_List.InsertColumn(3,"ACK",LVCFMT_RIGHT,listrc.Width()/7,subitemBytes);
204 m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize); 204 m_List.InsertColumn(4,"tsize",LVCFMT_RIGHT,listrc.Width()/7,subitemTSize);
205 205
206 LogLine(IDS_LOG_START); 206 LogLine(IDS_LOG_START);
207 207
208 SetupButtons(); 208 SetupButtons();
209 209
210CRect rc, drc; 210CRect rc, drc;
211 GetWindowRect(rc); 211 GetWindowRect(rc);
212 GetDesktopWindow()->GetWindowRect(drc); 212 GetDesktopWindow()->GetWindowRect(drc);
213 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER); 213 SetWindowPos(NULL,drc.right-6-rc.Width(),6,0,0,SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
214 214
215 if(m_bShown) 215 if(m_bShown)
216 ShowWindow(SW_SHOW); 216 ShowWindow(SW_SHOW);
217 else 217 else
218 ShowWindow(SW_HIDE); 218 ShowWindow(SW_HIDE);
219 219
220 // CG: The following block was added by the ToolTips component. 220 // CG: The following block was added by the ToolTips component.
221 { 221 {
222 // Create the ToolTip control. 222 // Create the ToolTip control.
223 m_tooltip.Create(this); 223 m_tooltip.Create(this);
224 m_tooltip.Activate(TRUE); 224 m_tooltip.Activate(TRUE);
225 225
226 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS); 226 m_tooltip.AddTool(&m_List,IDC_CONNECTIONS);
227 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT); 227 m_tooltip.AddTool(GetDlgItem(IDC_PUT),IDC_PUT);
228 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET); 228 m_tooltip.AddTool(GetDlgItem(IDC_GET),IDC_GET);
229 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT); 229 m_tooltip.AddTool(&m_AbortCtl,IDC_ABORT);
230 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS); 230 m_tooltip.AddTool(GetDlgItem(IDC_OPTIONS),IDC_OPTIONS);
231 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT); 231 m_tooltip.AddTool(GetDlgItem(IDC_EXIT),IDC_EXIT);
232 m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP); 232 m_tooltip.AddTool(GetDlgItem(ID_HELP),ID_HELP);
233 m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG); 233 m_tooltip.AddTool(GetDlgItem(IDC_LOG),IDC_LOG);
234 } 234 }
235 return TRUE; // return TRUE unless you set the focus to a control 235 return TRUE; // return TRUE unless you set the focus to a control
236} 236}
237 237
238void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam) 238void CPumpKINDlg::OnSysCommand(UINT nID, LPARAM lParam)
239{ 239{
240 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 240 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
241 { 241 {
242 CAboutDlg dlgAbout; 242 CAboutDlg dlgAbout;
243 dlgAbout.DoModal(); 243 dlgAbout.DoModal();
244 } 244 }
245 else 245 else
246 { 246 {
247 CDialog::OnSysCommand(nID, lParam); 247 CDialog::OnSysCommand(nID, lParam);
248 } 248 }
249} 249}
250 250
251void CPumpKINDlg::OnDestroy() 251void CPumpKINDlg::OnDestroy()
252{ 252{
253 SaveSettings(); 253 SaveSettings();
254 254
255NOTIFYICONDATA nid; 255NOTIFYICONDATA nid;
256 memset(&nid,0,sizeof(nid)); 256 memset(&nid,0,sizeof(nid));
257 nid.cbSize=sizeof(nid); 257 nid.cbSize=sizeof(nid);
258 nid.hWnd=m_Trayer->m_hWnd; 258 nid.hWnd=m_Trayer->m_hWnd;
259 nid.uID=IDC_TRAYICON; 259 nid.uID=IDC_TRAYICON;
260 nid.uFlags=0; 260 nid.uFlags=0;
261 VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid)); 261 VERIFY(Shell_NotifyIcon(NIM_DELETE,&nid));
262 262
263 WinHelp(0L, HELP_QUIT); 263 WinHelp(0L, HELP_QUIT);
264 CDialog::OnDestroy(); 264 CDialog::OnDestroy();
265POSITION p = m_LogTimes.GetStartPosition(); 265POSITION p = m_LogTimes.GetStartPosition();
266 while(p){ 266 while(p){
267 CTime *t,*tt; 267 CTime *t,*tt;
268 m_LogTimes.GetNextAssoc(p,t,tt); 268 m_LogTimes.GetNextAssoc(p,t,tt);
269 ASSERT(t && tt && t==tt); 269 ASSERT(t && tt && t==tt);
270 delete t; 270 delete t;
271 } 271 }
272 // *** Abort and cleanup transfers 272 // *** Abort and cleanup transfers
273 m_LogTimes.RemoveAll(); 273 m_LogTimes.RemoveAll();
274} 274}
275 275
276// If you add a minimize button to your dialog, you will need the code below 276// 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, 277// to draw the icon. For MFC applications using the document/view model,
278// this is automatically done for you by the framework. 278// this is automatically done for you by the framework.
279 279
280void CPumpKINDlg::OnPaint() 280void CPumpKINDlg::OnPaint()
281{ 281{
282 if (IsIconic()) 282 if (IsIconic())
283 { 283 {
284 CPaintDC dc(this); // device context for painting 284 CPaintDC dc(this); // device context for painting
285 285
286 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 286 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
287 287
288 // Center icon in client rectangle 288 // Center icon in client rectangle
289 int cxIcon = GetSystemMetrics(SM_CXICON); 289 int cxIcon = GetSystemMetrics(SM_CXICON);
290 int cyIcon = GetSystemMetrics(SM_CYICON); 290 int cyIcon = GetSystemMetrics(SM_CYICON);
291 CRect rect; 291 CRect rect;
292 GetClientRect(&rect); 292 GetClientRect(&rect);
293 int x = (rect.Width() - cxIcon + 1) / 2; 293 int x = (rect.Width() - cxIcon + 1) / 2;
294 int y = (rect.Height() - cyIcon + 1) / 2; 294 int y = (rect.Height() - cyIcon + 1) / 2;
295 295
296 // Draw the icon 296 // Draw the icon
297 dc.DrawIcon(x, y, m_hIcon); 297 dc.DrawIcon(x, y, m_hIcon);
298 } 298 }
299 else 299 else
300 { 300 {
301 CPaintDC pDC(this); 301 CPaintDC pDC(this);
302 CDC bmpDC; 302 CDC bmpDC;
303 bmpDC.CreateCompatibleDC(&pDC); 303 bmpDC.CreateCompatibleDC(&pDC);
304 bmpDC.SelectObject(&m_bmpBack); 304 bmpDC.SelectObject(&m_bmpBack);
305 CRect rc; 305 CRect rc;
306 GetClientRect(&rc); 306 GetClientRect(&rc);
307 for(int x=-m_bitmapBack.bmWidth*2/4;x<rc.Width();x+=m_bitmapBack.bmWidth) 307 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) 308 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); 309 pDC.BitBlt(x,y,m_bitmapBack.bmWidth,m_bitmapBack.bmHeight,&bmpDC,0,0,SRCCOPY);
310 bmpDC.DeleteDC(); 310 bmpDC.DeleteDC();
311 CDialog::OnPaint(); 311 CDialog::OnPaint();
312 } 312 }
313} 313}
314 314
315// The system calls this to obtain the cursor to display while the user drags 315// The system calls this to obtain the cursor to display while the user drags
316// the minimized window. 316// the minimized window.
317HCURSOR CPumpKINDlg::OnQueryDragIcon() 317HCURSOR CPumpKINDlg::OnQueryDragIcon()
318{ 318{
319 return (HCURSOR) m_hIcon; 319 return (HCURSOR) m_hIcon;
320} 320}
321 321
322int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 322int CPumpKINDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
323{ 323{
324 if (CDialog::OnCreate(lpCreateStruct) == -1) 324 if (CDialog::OnCreate(lpCreateStruct) == -1)
325 return -1; 325 return -1;
326 326
327 m_Listener.m_Daddy=this; 327 m_Listener.m_Daddy=this;
328 if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){ 328 if(!m_Listener.Create(m_ListenPort,SOCK_DGRAM)){
329 TRACE0("Failed to create socket\n"); 329 TRACE0("Failed to create socket\n");
330 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION); 330 AfxMessageBox(IDS_BOX_CANTBIND,MB_OK|MB_ICONEXCLAMATION);
331 return -1; 331 return -1;
332 } 332 }
333 333
334 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){ 334 if(!m_Trayer->Create(NULL,"PumpKIN TrayIcon",WS_CHILD,CRect(0,0,0,0),this,0)){
335 TRACE0("Failed to create trayer\n"); 335 TRACE0("Failed to create trayer\n");
336 return -1; 336 return -1;
337 } 337 }
338 338
339NOTIFYICONDATA nid; 339NOTIFYICONDATA nid;
340 memset(&nid,0,sizeof(nid)); 340 memset(&nid,0,sizeof(nid));
341 nid.cbSize=sizeof(nid); 341 nid.cbSize=sizeof(nid);
342 nid.hWnd=m_Trayer->m_hWnd; 342 nid.hWnd=m_Trayer->m_hWnd;
343 nid.uID=IDC_TRAYICON; 343 nid.uID=IDC_TRAYICON;
344 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 344 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
345 nid.uCallbackMessage=WM_TRAYICON; 345 nid.uCallbackMessage=WM_TRAYICON;
346 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); 346 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
347 // *** Load from resource 347 // *** Load from resource
348 strcpy(nid.szTip,"PumpKIN"); 348 strcpy(nid.szTip,"PumpKIN");
349 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid)); 349 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid));
350 350
351 return 0; 351 return 0;
352} 352}
353 353
354void CListenSocket::OnReceive(int nErrorCode) 354void CListenSocket::OnReceive(int nErrorCode)
355{ 355{
356 ASSERT(m_Daddy); 356 ASSERT(m_Daddy);
357 if(nErrorCode){ 357 if(nErrorCode){
358 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR); 358 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR);
359 return; 359 return;
360 } 360 }
361DWORD fionread = 0; 361DWORD fionread = 0;
362 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired 362 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired
363tftp *tftpRQ = tftp::Allocate(fionread); 363tftp *tftpRQ = tftp::Allocate(fionread);
364 ASSERT(tftpRQ); 364 ASSERT(tftpRQ);
365SOCKADDR_IN sin; 365SOCKADDR_IN sin;
366 if(!tftpRQ->Receive(this,fionread,&sin)){ 366 if(!tftpRQ->Receive(this,fionread,&sin)){
367 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR); 367 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR);
368 delete tftpRQ; 368 delete tftpRQ;
369 return; 369 return;
370 } 370 }
371 #ifndefNDEBUG 371 #ifndefNDEBUG
372CString tmp; 372CString tmp;
373 tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port); 373 tmp.Format("%u - %s - %u\n",tftpRQ->Opcode(),inet_ntoa(sin.sin_addr),sin.sin_port);
374 TRACE0(tmp); 374 TRACE0(tmp);
375#endif 375#endif
376POSITION p = m_Daddy->m_Xfers.GetStartPosition(); 376POSITION p = m_Daddy->m_Xfers.GetStartPosition();
377 while(p){ 377 while(p){
378 SOCKET key; 378 SOCKET key;
379 CXferSocket *sock; 379 CXferSocket *sock;
380 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock); 380 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock);
381 ASSERT(sock); 381 ASSERT(sock);
382 if(sock->m_Peer.sin_addr.s_addr==sin.sin_addr.s_addr && sock->m_Peer.sin_port==sin.sin_port){ 382 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"); 383 TRACE0("Ignoring request which we are already processing\n");
384 delete tftpRQ; 384 delete tftpRQ;
385 return; 385 return;
386 } 386 }
387 } 387 }
388 switch(tftpRQ->Opcode()){ 388 switch(tftpRQ->Opcode()){
389 case tftp::opRRQ: 389 case tftp::opRRQ:
390 // Read Request 390 // Read Request
391 { 391 {
392 CString tmp; 392 CString tmp;
393 tmp.Format(IDS_LOG_RRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr)); 393 tmp.Format(IDS_LOG_RRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr));
394 m_Daddy->LogLine(tmp); 394 m_Daddy->LogLine(tmp);
395 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 395 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
396 ASSERT(s); 396 ASSERT(s);
397 tftpRQ->GetOptions(&s->m_Options); 397 tftpRQ->GetOptions(&s->m_Options);
398 if(!s->Create()) 398 if(!s->Create())
399 s->Destroy(FALSE); 399 s->Destroy(FALSE);
400 } 400 }
401 break; 401 break;
402 case tftp::opWRQ: 402 case tftp::opWRQ:
403 // Write Request 403 // Write Request
404 { 404 {
405 CString tmp; 405 CString tmp;
406 tmp.Format(IDS_LOG_WRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr)); 406 tmp.Format(IDS_LOG_WRQSERVE,tftpRQ->rqFileName(),tftpRQ->rqType(),inet_ntoa(sin.sin_addr));
407 m_Daddy->LogLine(tmp); 407 m_Daddy->LogLine(tmp);
408 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 408 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
409 ASSERT(s); 409 ASSERT(s);
410 tftpRQ->GetOptions(&s->m_Options); 410 tftpRQ->GetOptions(&s->m_Options);
411 if(!s->Create(NULL,NULL)) 411 if(!s->Create(NULL,NULL))
412 s->Destroy(FALSE); 412 s->Destroy(FALSE);
413 } 413 }
414 break; 414 break;
415 default: 415 default:
416 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE); 416 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE);
417 delete tftpRQ; 417 delete tftpRQ;
418 return; 418 return;
419 } 419 }
420 delete tftpRQ; 420 delete tftpRQ;
421} 421}
422 422
423BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin) 423BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin)
424{ 424{
425 ASSERT(socket); 425 ASSERT(socket);
426int saddrLen = sizeof(SOCKADDR_IN); 426int saddrLen = sizeof(SOCKADDR_IN);
427 length = sin ? 427 length = sin ?
428 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen) 428 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen)
429 : 429 :
430 socket->Receive(udpBase(),maxLength) 430 socket->Receive(udpBase(),maxLength)
431 ; 431 ;
432 if(!length) 432 if(!length)
433 return FALSE; 433 return FALSE;
434 if(length==(tftpLength)SOCKET_ERROR) 434 if(length==(tftpLength)SOCKET_ERROR)
435 return FALSE; 435 return FALSE;
436 return TRUE; 436 return TRUE;
437} 437}
438 438
439UINT tftp::Opcode() 439UINT tftp::Opcode()
440{ 440{
441 return REVERSEBYTES(opcode); 441 return REVERSEBYTES(opcode);
442} 442}
443 443
444CString tftp::rqFileName() 444CString tftp::rqFileName()
445{ 445{
446 ASSERT(length); 446 ASSERT(length);
447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
448CString rv; 448CString rv;
449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode))) 449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode)))
450 rv = (LPCTSTR)data.m_RQ.data; 450 rv = (LPCTSTR)data.m_RQ.data;
451 return rv; 451 return rv;
452} 452}
453 453
454CString tftp::rqType() 454CString tftp::rqType()
455{ 455{
456 ASSERT(length); 456 ASSERT(length);
457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
458CString rv; 458CString rv;
459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
460 if(tmp++) 460 if(tmp++)
461 rv = (LPCTSTR)tmp; 461 rv = (LPCTSTR)tmp;
462 return rv; 462 return rv;
463} 463}
464 464
465UINT tftp::GetOptions(tftp::tftpOptions* ops) 465UINT tftp::GetOptions(tftp::tftpOptions* ops)
466{ 466{
467 ASSERT(length); 467 ASSERT(length);
468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK); 468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK);
469 ASSERT(ops); 469 ASSERT(ops);
470tftpOptions& o = *ops; 470tftpOptions& o = *ops;
471LPSTR base = (LPSTR)&data.m_RQ.data; 471LPSTR base = (LPSTR)&data.m_RQ.data;
472UINT basePtr = 0; 472UINT basePtr = 0;
473 if(Opcode()==opRRQ || Opcode()==opWRQ){ 473 if(Opcode()==opRRQ || Opcode()==opWRQ){
474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
475 if(!base) 475 if(!base)
476 return 0; 476 return 0;
477 base++; 477 base++;
478 basePtr = (base-(LPSTR)&data.m_RQ.data); 478 basePtr = (base-(LPSTR)&data.m_RQ.data);
479 base = (LPSTR)memchr(base,0,length-basePtr); 479 base = (LPSTR)memchr(base,0,length-basePtr);
480 if(!base) 480 if(!base)
481 return 0; 481 return 0;
482 base++; 482 base++;
483 basePtr = (base-(LPSTR)&data.m_RQ.data); 483 basePtr = (base-(LPSTR)&data.m_RQ.data);
484 } 484 }
485 ops->RemoveAll(); 485 ops->RemoveAll();
486UINT rv = 0; 486UINT rv = 0;
487 while(basePtr<(length-sizeof(opcode))){ 487 while(basePtr<(length-sizeof(opcode))){
488 CString onam = (LPSTR)&data.m_RQ.data[basePtr]; 488 CString onam = (LPSTR)&data.m_RQ.data[basePtr];
489 basePtr+=onam.GetLength()+1; 489 basePtr+=onam.GetLength()+1;
490 CString oval = (LPSTR)&data.m_RQ.data[basePtr]; 490 CString oval = (LPSTR)&data.m_RQ.data[basePtr];
491 basePtr+=oval.GetLength()+1; 491 basePtr+=oval.GetLength()+1;
492 onam.MakeLower(); 492 onam.MakeLower();
493 o[onam]=oval; 493 o[onam]=oval;
494 rv++; 494 rv++;
495 } 495 }
496 return rv; 496 return rv;
497} 497}
498 498
499tftp::tftp() 499tftp::tftp()
500{ 500{
501 length=0; 501 length=0;
502} 502}
503 503
504 504
505void CXferSocket::OnSend(int nErrorCode) 505void CXferSocket::OnSend(int nErrorCode)
506{ 506{
507 if(nErrorCode){ 507 if(nErrorCode){
508 ASSERT(m_Daddy); 508 ASSERT(m_Daddy);
509 m_Daddy->LogLine(IDS_LOG_XFERSEND); 509 m_Daddy->LogLine(IDS_LOG_XFERSEND);
510 return; 510 return;
511 } 511 }
512 if(!m_Queue.IsEmpty()){ 512 if(!m_Queue.IsEmpty()){
513 tftp *p = m_Queue.GetHead(); 513 tftp *p = m_Queue.GetHead();
514 ASSERT(p); 514 ASSERT(p);
515 m_Queue.RemoveHead(); 515 m_Queue.RemoveHead();
516 if(!p->Send(this,&m_Peer)){ 516 if(!p->Send(this,&m_Peer)){
517 ASSERT(m_Daddy); 517 ASSERT(m_Daddy);
518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); 518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND);
519 } 519 }
520 delete p; 520 delete p;
521 } 521 }
522 DoSelect(); 522 DoSelect();
523 if(m_Queue.IsEmpty()){ 523 if(m_Queue.IsEmpty()){
524 switch(state){ 524 switch(state){
525 case stateDeny: 525 case stateDeny:
526 Destroy(FALSE); 526 Destroy(FALSE);
527 break; 527 break;
528 case stateFinish: 528 case stateFinish:
529 Destroy(TRUE); 529 Destroy(TRUE);
530 break; 530 break;
531 } 531 }
532 } 532 }
533} 533}
534 534
535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) 535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr)
536{ 536{
537 ASSERT(socket); 537 ASSERT(socket);
538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); 538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN));
539 if(rv!=length) 539 if(rv!=length)
540 return FALSE; 540 return FALSE;
541 return TRUE; 541 return TRUE;
542} 542}
543 543
544void CXferSocket::DoSelect() 544void CXferSocket::DoSelect()
545{ 545{
546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE) 546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE)
547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); 547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE));
548} 548}
549 549
550void CXferSocket::OnReceive(int nErrorCode) 550void CXferSocket::OnReceive(int nErrorCode)
551{ 551{
552 if(nErrorCode){ 552 if(nErrorCode){
553 ASSERT(m_Daddy); 553 ASSERT(m_Daddy);
554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); 554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE);
555 return; 555 return;
556 } 556 }
557 ASSERT(m_Daddy); 557 ASSERT(m_Daddy);
558DWORD fionread = 0; 558DWORD fionread = 0;
559 VERIFY(IOCtl(FIONREAD,&fionread)); 559 VERIFY(IOCtl(FIONREAD,&fionread));
560tftp *p = tftp::Allocate(fionread); 560tftp *p = tftp::Allocate(fionread);
561 ASSERT(p); 561 ASSERT(p);
562SOCKADDR_IN sin; 562SOCKADDR_IN sin;
563 if(!p->Receive(this,fionread,&sin)){ 563 if(!p->Receive(this,fionread,&sin)){
564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); 564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE);
565 delete p; 565 delete p;
566 }else 566 }else
567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){ 567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){
568 m_Peer.sin_addr=sin.sin_addr; 568 m_Peer.sin_addr=sin.sin_addr;
569 m_Peer.sin_port=sin.sin_port; 569 m_Peer.sin_port=sin.sin_port;
570 } 570 }
571BOOL alive = TRUE; 571BOOL alive = TRUE;
572 if(state==stateInit){ 572 if(state==stateInit){
573 state=stateXfer; 573 state=stateXfer;
574 m_Peer.sin_port=sin.sin_port; 574 m_Peer.sin_port=sin.sin_port;
575 UpdateList(); 575 UpdateList();
576 } 576 }
577 if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){ 577 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); 578 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID);
579 // *** Bounce it! 579 // *** Bounce it!
580 }else{ 580 }else{
581 alive = OnTFTP(p); 581 alive = OnTFTP(p);
582 } 582 }
583 delete p; 583 delete p;
584 if(alive){ 584 if(alive){
585 DoSelect(); 585 DoSelect();
586 ResetTimeout(); 586 ResetTimeout();
587 } 587 }
588} 588}
589 589
590void CXferSocket::SetPeer(SOCKADDR_IN *sin) 590void CXferSocket::SetPeer(SOCKADDR_IN *sin)
591{ 591{
592 ASSERT(sin); 592 ASSERT(sin);
593 memmove(&m_Peer,sin,sizeof(m_Peer)); 593 memmove(&m_Peer,sin,sizeof(m_Peer));
594} 594}
595 595
596void CXferSocket::UpdateList() 596void CXferSocket::UpdateList()
597{ 597{
598 ASSERT(m_Daddy); 598 ASSERT(m_Daddy);
599LV_FINDINFO lvf; 599LV_FINDINFO lvf;
600 memset(&lvf,0,sizeof(lvf)); 600 memset(&lvf,0,sizeof(lvf));
601 lvf.flags=LVFI_PARAM; 601 lvf.flags=LVFI_PARAM;
602 lvf.lParam=(LPARAM)this; 602 lvf.lParam=(LPARAM)this;
603int i = m_Daddy->m_List.FindItem(&lvf); 603int i = m_Daddy->m_List.FindItem(&lvf);
604 if(i<0){ 604 if(i<0){
605 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); 605 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); 606 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)); 607 ASSERT(!(i<0));
608 m_Daddy->m_List.SetItemData(i,(DWORD)this); 608 m_Daddy->m_List.SetItemData(i,(DWORD)this);
609 } 609 }
610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); 610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName);
611 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); 611 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)); 612 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr));
613CString tmp; 613CString tmp;
614 tmp.Format(IDS_FMT_BYTES,GetACK()); 614 tmp.Format(IDS_FMT_BYTES,GetACK());
615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); 615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp);
616 if(m_xferSize>=0){ 616 if(m_xferSize>=0){
617 tmp.Format(IDS_FMT_BYTES,m_xferSize); 617 tmp.Format(IDS_FMT_BYTES,m_xferSize);
618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); 618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp);
619 } 619 }
620} 620}
621 621
622CXferSocket::CXferSocket() 622CXferSocket::CXferSocket()
623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
624 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 624 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
625 m__blkSize(512), m__timeOut(30) 625 m__blkSize(512), m__timeOut(30)
626{ 626{
627 m_Daddy=NULL; 627 m_Daddy=NULL;
628 m_Peer.sin_addr.s_addr=INADDR_NONE; 628 m_Peer.sin_addr.s_addr=INADDR_NONE;
629 m_Peer.sin_family=AF_INET; 629 m_Peer.sin_family=AF_INET;
630 state=stateNone; 630 state=stateNone;
631} 631}
632 632
633ULONG CXferSocket::GetACK() 633ULONG CXferSocket::GetACK()
634{ 634{
635 return 0; 635 return 0;
636} 636}
637 637
638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) 638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin)
639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
640 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 640 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
641 m__blkSize(512), m__timeOut(30) 641 m__blkSize(512), m__timeOut(30)
642{ 642{
643 m_Peer.sin_family=AF_INET; 643 m_Peer.sin_family=AF_INET;
644 state=stateNone; 644 state=stateNone;
645 ASSERT(daddy); 645 ASSERT(daddy);
646 m_Daddy=daddy; 646 m_Daddy=daddy;
647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); 647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds();
648 if(sin){ 648 if(sin){
649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; 649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr;
650 m_Peer.sin_port=sin->sin_port; 650 m_Peer.sin_port=sin->sin_port;
651 }else 651 }else
652 m_Peer.sin_addr.s_addr=INADDR_NONE; 652 m_Peer.sin_addr.s_addr=INADDR_NONE;
653 m_FileName=fileName; 653 m_FileName=fileName;
654 m_Type=type; 654 m_Type=type;
655} 655}
656 656
657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
658{ 658{
659 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 659 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
660 return FALSE; 660 return FALSE;
661 ASSERT(m_Daddy); 661 ASSERT(m_Daddy);
662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
663 m_Daddy->m_Xfers[m_hSocket]=this; 663 m_Daddy->m_Xfers[m_hSocket]=this;
664CString lFile = localFile?localFile:m_FileName; 664CString lFile = localFile?localFile:m_FileName;
665 TurnSlashes(lFile,TRUE); 665 TurnSlashes(lFile,TRUE);
666 UpdateList(); 666 UpdateList();
667 if(!localFile){// Check only if server 667 if(!localFile){// Check only if server
668 if(CheckBadRelativeness(m_FileName)){ 668 if(CheckBadRelativeness(m_FileName)){
669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
670 return TRUE; 670 return TRUE;
671 } 671 }
672 switch(m_Daddy->m_RRQMode){ 672 switch(m_Daddy->m_RRQMode){
673 case CPumpKINDlg::rrqGiveAll: 673 case CPumpKINDlg::rrqGiveAll:
674 break; 674 break;
675 case CPumpKINDlg::rrqAlwaysConfirm: 675 case CPumpKINDlg::rrqAlwaysConfirm:
676 if(ConfirmRequest()) 676 if(ConfirmRequest())
677 break; 677 break;
678 case CPumpKINDlg::rrqDenyAll: 678 case CPumpKINDlg::rrqDenyAll:
679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
680 return TRUE; 680 return TRUE;
681 } 681 }
682 } 682 }
683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); 683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
684CFileException e; 684CFileException e;
685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){ 685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
686 if(localFile){ 686 if(localFile){
687 CString tmp; 687 CString tmp;
688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn); 688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
689 m_Daddy->LogLine(tmp); 689 m_Daddy->LogLine(tmp);
690 return FALSE; 690 return FALSE;
691 } 691 }
692 Deny(&e); 692 Deny(&e);
693 return TRUE; 693 return TRUE;
694 } 694 }
695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION 695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION
696 if(hostName){ 696 if(hostName){
697 m_HostName=hostName; 697 m_HostName=hostName;
698 698
699 CString tmp; 699 CString tmp;
700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); 700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName);
701 m_Daddy->LogLine(tmp); 701 m_Daddy->LogLine(tmp);
702 702
703 CString inAddr = hostName; 703 CString inAddr = hostName;
704 int at = inAddr.Find('@'); 704 int at = inAddr.Find('@');
705 if(at>=0) 705 if(at>=0)
706 inAddr=inAddr.Mid(at+1); 706 inAddr=inAddr.Mid(at+1);
707 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 707 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
708 ASSERT(!m_wndResolver); 708 ASSERT(!m_wndResolver);
709 m_wndResolver = new CResolver(this); 709 m_wndResolver = new CResolver(this);
710 ASSERT(m_wndResolver); 710 ASSERT(m_wndResolver);
711 return m_wndResolver->Resolve(); 711 return m_wndResolver->Resolve();
712 } 712 }
713 else 713 else
714 OnHostKnown(); 714 OnHostKnown();
715 }else{ 715 }else{
716 tftp::tftpOptions o; 716 tftp::tftpOptions o;
717 CString v; 717 CString v;
718 if(m_Options.Lookup(tftpoBSize,v)){ 718 if(m_Options.Lookup(tftpoBSize,v)){
719 m__blkSize=atoi(v); 719 m__blkSize=atoi(v);
720 if(m__blkSize){ 720 if(m__blkSize){
721 m_blkSize=m__blkSize; 721 m_blkSize=m__blkSize;
722 v.Format("%u",m_blkSize); 722 v.Format("%u",m_blkSize);
723 o[tftpoBSize]=v; 723 o[tftpoBSize]=v;
724 } 724 }
725 } 725 }
726 if(m_Options.Lookup(tftpoTSize,v)){ 726 if(m_Options.Lookup(tftpoTSize,v)){
727 v.Format("%lu",m_xferSize); 727 v.Format("%lu",m_xferSize);
728 o[tftpoTSize]=v; 728 o[tftpoTSize]=v;
729 } 729 }
730 if(m_Options.Lookup(tftpoTOut,v)){ 730 if(m_Options.Lookup(tftpoTOut,v)){
731 m__timeOut=atoi(v); 731 m__timeOut=atoi(v);
732 if(m__timeOut){ 732 if(m__timeOut){
733 m_timeOut=m__timeOut; 733 m_timeOut=m__timeOut;
734 v.Format("%u",m_timeOut); 734 v.Format("%u",m_timeOut);
735 o[tftpoTOut]=v; 735 o[tftpoTOut]=v;
736 } 736 }
737 } 737 }
738 state = stateXfer; 738 state = stateXfer;
739 m_ACK=0; 739 m_ACK=0;
740 if(o.GetCount()){ 740 if(o.GetCount()){
741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o)); 741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o));
742 ASSERT(p); 742 ASSERT(p);
743 p->SetOpcode(tftp::opOACK); 743 p->SetOpcode(tftp::opOACK);
744 p->data.m_OACK.Set(&o); 744 p->data.m_OACK.Set(&o);
745 PostTFTP(p,TRUE); 745 PostTFTP(p,TRUE);
746 }else 746 }else
747 DoXfer(); 747 DoXfer();
748 } 748 }
749 return TRUE; 749 return TRUE;
750} 750}
751 751
752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
753 : CXferSocket(daddy,fileName,type,sin) 753 : CXferSocket(daddy,fileName,type,sin)
754{ 754{
755 m_ACK=0; 755 m_ACK=0;
756 m_LastSlack=0; 756 m_LastSlack=0;
757} 757}
758 758
759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg) 759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg)
760{ 760{
761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1; 761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1;
762} 762}
763 763
764tftp* tftp::Allocate(UINT tftpSize) 764tftp* tftp::Allocate(UINT tftpSize)
765{ 765{
766 ASSERT(tftpSize); 766 ASSERT(tftpSize);
767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize]; 767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize];
768 ASSERT(rv); 768 ASSERT(rv);
769 rv->length=tftpSize; 769 rv->length=tftpSize;
770 return rv; 770 return rv;
771} 771}
772 772
773void tftp::errSet(UINT code,LPCTSTR msg) 773void tftp::errSet(UINT code,LPCTSTR msg)
774{ 774{
775 ASSERT(this); 775 ASSERT(this);
776 ASSERT(length>=data.m_ERROR.tftpSize(msg)); 776 ASSERT(length>=data.m_ERROR.tftpSize(msg));
777 strcpy((char*)data.m_ERROR.data,msg); 777 strcpy((char*)data.m_ERROR.data,msg);
778 data.m_ERROR.SetCode(code); 778 data.m_ERROR.SetCode(code);
779} 779}
780 780
781void CXferSocket::PostTFTP(tftp* p,BOOL retryable) 781void CXferSocket::PostTFTP(tftp* p,BOOL retryable)
782{ 782{
783 ASSERT(p); 783 ASSERT(p);
784 m_Queue.AddTail(p); 784 m_Queue.AddTail(p);
785 DoSelect(); 785 DoSelect();
786 if(!m_bRetry){ 786 if(!m_bRetry){
787 if(retryable) 787 if(retryable)
788 SetTry(p); 788 SetTry(p);
789 else 789 else
790 SetTry(); 790 SetTry();
791 } 791 }
792 ResetTimeout(); 792 ResetTimeout();
793} 793}
794 794
795void CXferSocket::Deny(UINT errCode,UINT errID) 795void CXferSocket::Deny(UINT errCode,UINT errID)
796{ 796{
797 PostError(errCode,errID); 797 PostError(errCode,errID);
798 state=stateDeny; 798 state=stateDeny;
799} 799}
800 800
801void CRRQSocket::DoXfer() 801void CRRQSocket::DoXfer()
802{ 802{
803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); 803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
804 ASSERT(p); 804 ASSERT(p);
805 p->SetOpcode(tftp::opDATA); 805 p->SetOpcode(tftp::opDATA);
806 TRY{ 806 TRY{
807 m_File.Seek(m_ACK*m_blkSize,CFile::begin); 807 m_File.Seek(m_ACK*m_blkSize,CFile::begin);
808 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize); 808 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize);
809 p->data.m_DATA.SetBlock(m_ACK+1); 809 p->data.m_DATA.SetBlock(m_ACK+1);
810 p->length=p->length-m_blkSize+bytes; 810 p->length=p->length-m_blkSize+bytes;
811 m_LastSlack = m_blkSize-bytes; 811 m_LastSlack = m_blkSize-bytes;
812 PostTFTP(p); 812 PostTFTP(p);
813 if(bytes<m_blkSize){ 813 if(bytes<m_blkSize){
814 state=stateFinish; 814 state=stateFinish;
815 ASSERT(m_Daddy); 815 ASSERT(m_Daddy);
816 CString tmp; 816 CString tmp;
817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName); 817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
818 m_Daddy->LogLine(tmp); 818 m_Daddy->LogLine(tmp);
819 } 819 }
820 }CATCH(CFileException,e){ 820 }CATCH(CFileException,e){
821 Deny(e); 821 Deny(e);
822 }END_CATCH 822 }END_CATCH
823} 823}
824 824
825UINT tftp::tftpDATA::tftpSize(UINT blkSize) 825UINT tftp::tftpDATA::tftpSize(UINT blkSize)
826{ 826{
827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA) 827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
828 -sizeof(BYTE)+blkSize; 828 -sizeof(BYTE)+blkSize;
829} 829}
830 830
831void CXferSocket::Deny(CFileException* e) 831void CXferSocket::Deny(CFileException* e)
832{ 832{
833 PostError(e); 833 PostError(e);
834 state=stateDeny; 834 state=stateDeny;
835} 835}
836 836
837void CXferSocket::PostError(UINT errCode,UINT errID) 837void CXferSocket::PostError(UINT errCode,UINT errID)
838{ 838{
839CString msg; 839CString msg;
840 msg.LoadString(errID); 840 msg.LoadString(errID);
841 ASSERT(m_Daddy); 841 ASSERT(m_Daddy);
842 /*// *** 842 /*// ***
843CString tmp; 843CString tmp;
844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg); 844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg);
845 m_Daddy->LogLine(tmp); 845 m_Daddy->LogLine(tmp);
846 */ 846 */
847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg)); 847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg));
848err->SetOpcode(tftp::opERROR); 848err->SetOpcode(tftp::opERROR);
849 err->errSet(errCode,msg); 849 err->errSet(errCode,msg);
850 PostTFTP(err); 850 PostTFTP(err);
851} 851}
852 852
853void CXferSocket::PostError(CFileException* e) 853void CXferSocket::PostError(CFileException* e)
854{ 854{
855UINT eCode; 855UINT eCode;
856UINT eMsgID; 856UINT eMsgID;
857 switch(e->m_cause){ 857 switch(e->m_cause){
858 case CFileException::fileNotFound: 858 case CFileException::fileNotFound:
859 eCode=tftp::errNotFound; 859 eCode=tftp::errNotFound;
860 eMsgID=IDS_TFTP_ERROR_NOTFOUND; 860 eMsgID=IDS_TFTP_ERROR_NOTFOUND;
861 break; 861 break;
862 case CFileException::accessDenied: 862 case CFileException::accessDenied:
863 eCode=tftp::errAccessViolation; 863 eCode=tftp::errAccessViolation;
864 eMsgID=IDS_TFTP_ERROR_ACCESS; 864 eMsgID=IDS_TFTP_ERROR_ACCESS;
865 break; 865 break;
866 case CFileException::directoryFull: 866 case CFileException::directoryFull:
867 eCode=tftp::errDiskFull; 867 eCode=tftp::errDiskFull;
868 eMsgID=IDS_TFTP_ERROR_DIRFULL; 868 eMsgID=IDS_TFTP_ERROR_DIRFULL;
869 break; 869 break;
870 case CFileException::sharingViolation: 870 case CFileException::sharingViolation:
871 eCode=tftp::errAccessViolation; 871 eCode=tftp::errAccessViolation;
872 eMsgID=IDS_TFTP_ERROR_SHARING; 872 eMsgID=IDS_TFTP_ERROR_SHARING;
873 break; 873 break;
874 case CFileException::diskFull: 874 case CFileException::diskFull:
875 eCode=tftp::errDiskFull; 875 eCode=tftp::errDiskFull;
876 eMsgID=IDS_TFTP_ERROR_DISKFULL; 876 eMsgID=IDS_TFTP_ERROR_DISKFULL;
877 break; 877 break;
878 default: 878 default:
879 eCode=tftp::errUndefined; 879 eCode=tftp::errUndefined;
880 eMsgID=IDS_TFTP_ERROR_UNDEFINED; 880 eMsgID=IDS_TFTP_ERROR_UNDEFINED;
881 break; 881 break;
882 } 882 }
883 PostError(eCode,eMsgID); 883 PostError(eCode,eMsgID);
884} 884}
885 885
886ULONG CRRQSocket::GetACK(void) 886ULONG CRRQSocket::GetACK(void)
887{ 887{
888 return (m_ACK*m_blkSize)-m_LastSlack; 888 return (m_ACK*m_blkSize)-m_LastSlack;
889} 889}
890 890
891BOOL CRRQSocket::OnTFTP(tftp* p) 891BOOL CRRQSocket::OnTFTP(tftp* p)
892{ 892{
893BOOL rv = TRUE; 893BOOL rv = TRUE;
894 switch(p->Opcode()){ 894 switch(p->Opcode()){
895 case tftp::opOACK: 895 case tftp::opOACK:
896 m_ACK=0; 896 m_ACK=0;
897 ASSERT(state!=stateFinish); 897 ASSERT(state!=stateFinish);
898 { 898 {
899 tftp::tftpOptions o; 899 tftp::tftpOptions o;
900 if(p->GetOptions(&o)){ 900 if(p->GetOptions(&o)){
901 CString v; 901 CString v;
902 if(o.Lookup(tftpoBSize,v)){ 902 if(o.Lookup(tftpoBSize,v)){
903 m_blkSize=atoi(v); 903 m_blkSize=atoi(v);
904 if(!m_blkSize){// *** More sanity checks 904 if(!m_blkSize){// *** More sanity checks
905 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 905 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
906 rv = TRUE; 906 rv = TRUE;
907 break; 907 break;
908 } 908 }
909 } 909 }
910 if(o.Lookup(tftpoTOut,v)){ 910 if(o.Lookup(tftpoTOut,v)){
911 m_timeOut=atoi(v); 911 m_timeOut=atoi(v);
912 if(!m_timeOut){// *** More sanity checks 912 if(!m_timeOut){// *** More sanity checks
913 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 913 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
914 rv = TRUE; 914 rv = TRUE;
915 break; 915 break;
916 } 916 }
917 } 917 }
918 if(o.Lookup(tftpoXResume,v)){ 918 if(o.Lookup(tftpoXResume,v)){
919 m_ACK=atoi(v); 919 m_ACK=atoi(v);
920 } 920 }
921 } 921 }
922 UpdateList(); 922 UpdateList();
923 DoXfer(); 923 DoXfer();
924 } 924 }
925 break; 925 break;
926 case tftp::opACK: 926 case tftp::opACK:
927 m_ACK=p->data.m_ACK.Block(); 927 m_ACK=p->data.m_ACK.Block();
928 if(state!=stateFinish){ 928 if(state!=stateFinish){
929 UpdateList(); 929 UpdateList();
930 DoXfer(); 930 DoXfer();
931 } 931 }
932 break; 932 break;
933 case tftp::opERROR: 933 case tftp::opERROR:
934 { 934 {
935 ASSERT(m_Daddy); 935 ASSERT(m_Daddy);
936 CString tmp; 936 CString tmp;
937 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 937 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
938 m_Daddy->LogLine(tmp); 938 m_Daddy->LogLine(tmp);
939 } 939 }
940 Destroy(FALSE); 940 Destroy(FALSE);
941 rv = FALSE; 941 rv = FALSE;
942 break; 942 break;
943 default: 943 default:
944 ASSERT(m_Daddy); 944 {
945 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 945 ASSERT(m_Daddy);
946 // *** Self destruct maybe?? 946 CString tmp;
947 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
948 m_Daddy->LogLine(tmp);
949 // *** Self destruct maybe??
950 }
947 break; 951 break;
948 } 952 }
949 return rv; 953 return rv;
950} 954}
951 955
952BOOL CWRQSocket::OnTFTP(tftp* p) 956BOOL CWRQSocket::OnTFTP(tftp* p)
953{ 957{
954 switch(p->Opcode()){ 958 switch(p->Opcode()){
955 case tftp::opOACK: 959 case tftp::opOACK:
956 ASSERT(state!=stateFinish); 960 ASSERT(state!=stateFinish);
957 { 961 {
958 if(m_bResume) 962 if(m_bResume)
959 m_ACK=m_File.GetLength()/m_blkSize; 963 m_ACK=m_File.GetLength()/m_blkSize;
960 else 964 else
961 m_ACK=0; 965 m_ACK=0;
962 tftp::tftpOptions o; 966 tftp::tftpOptions o;
963 if(p->GetOptions(&o)){ 967 if(p->GetOptions(&o)){
964 CString v; 968 CString v;
965 if(o.Lookup(tftpoBSize,v)){ 969 if(o.Lookup(tftpoBSize,v)){
966 m_blkSize=atoi(v); 970 m_blkSize=atoi(v);
967 if(!m_blkSize){// *** More sanity checks 971 if(!m_blkSize){// *** More sanity checks
968 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 972 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
969 return TRUE; 973 return TRUE;
970 } 974 }
971 } 975 }
972 if(o.Lookup(tftpoTOut,v)){ 976 if(o.Lookup(tftpoTOut,v)){
973 m_timeOut=atoi(v); 977 m_timeOut=atoi(v);
974 if(!m_timeOut){// *** More sanity checks 978 if(!m_timeOut){// *** More sanity checks
975 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 979 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
976 return TRUE; 980 return TRUE;
977 } 981 }
978 } 982 }
979 if(o.Lookup(tftpoTSize,v)){ 983 if(o.Lookup(tftpoTSize,v)){
980 m_xferSize=atoi(v); 984 m_xferSize=atoi(v);
981 } 985 }
982 } 986 }
983 UpdateList(); 987 UpdateList();
984 DoXfer(); 988 DoXfer();
985 } 989 }
986 break; 990 break;
987 case tftp::opDATA: 991 case tftp::opDATA:
988 { 992 {
989 UINTblock = p->data.m_DATA.Block(); 993 UINTblock = p->data.m_DATA.Block();
990 TRY{ 994 TRY{
991 m_File.Seek((block-1)*m_blkSize,CFile::begin); 995 m_File.Seek((block-1)*m_blkSize,CFile::begin);
992 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); 996 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize);
993 if(bytes){ 997 if(bytes){
994 m_File.Write(p->data.m_DATA.data,bytes); 998 m_File.Write(p->data.m_DATA.data,bytes);
995 // *** Move to the other place where we can do it not that often 999 // *** Move to the other place where we can do it not that often
996 m_File.SetLength(m_File.GetPosition()); 1000 m_File.SetLength(m_File.GetPosition());
997 } 1001 }
998 if(bytes<m_blkSize){ 1002 if(bytes<m_blkSize){
999 state=stateFinish; 1003 state=stateFinish;
1000 ASSERT(m_Daddy); 1004 ASSERT(m_Daddy);
1001 CString tmp; 1005 CString tmp;
1002 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); 1006 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName);
1003 m_Daddy->LogLine(tmp); 1007 m_Daddy->LogLine(tmp);
1004 } 1008 }
1005 m_ACK=block; 1009 m_ACK=block;
1006 m_LastSlack=m_blkSize-bytes; 1010 m_LastSlack=m_blkSize-bytes;
1007 UpdateList(); 1011 UpdateList();
1008 DoXfer(); 1012 DoXfer();
1009 }CATCH(CFileException,e){ 1013 }CATCH(CFileException,e){
1010 Deny(e); 1014 Deny(e);
1011 }END_CATCH 1015 }END_CATCH
1012 } 1016 }
1013 break; 1017 break;
1014 case tftp::opERROR: 1018 case tftp::opERROR:
1015 { 1019 {
1016 ASSERT(m_Daddy); 1020 ASSERT(m_Daddy);
1017 CString tmp; 1021 CString tmp;
1018 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 1022 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
1019 m_Daddy->LogLine(tmp); 1023 m_Daddy->LogLine(tmp);
1020 } 1024 }
1021 Destroy(FALSE); 1025 Destroy(FALSE);
1022 return FALSE; 1026 return FALSE;
1023 default: 1027 default:
1024 ASSERT(m_Daddy); 1028 {
1025 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 1029 ASSERT(m_Daddy);
1026 // *** Self destruct maybe?? 1030 CString tmp;
1031 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
1032 m_Daddy->LogLine(tmp);
1033 // *** Self destruct maybe??
1034 }
1027 break; 1035 break;
1028 } 1036 }
1029 return TRUE; 1037 return TRUE;
1030} 1038}
1031 1039
1032void tftp::SetOpcode(WORD op) 1040void tftp::SetOpcode(WORD op)
1033{ 1041{
1034 opcode = REVERSEBYTES(op); 1042 opcode = REVERSEBYTES(op);
1035} 1043}
1036void tftp::tftpDATA::SetBlock(WORD b) 1044void tftp::tftpDATA::SetBlock(WORD b)
1037{ 1045{
1038 block=REVERSEBYTES(b); 1046 block=REVERSEBYTES(b);
1039} 1047}
1040WORD tftp::tftpDATA::Block() 1048WORD tftp::tftpDATA::Block()
1041{ 1049{
1042 return REVERSEBYTES(block); 1050 return REVERSEBYTES(block);
1043} 1051}
1044WORD tftp::tftpACK::Block() 1052WORD tftp::tftpACK::Block()
1045{ 1053{
1046 return REVERSEBYTES(block); 1054 return REVERSEBYTES(block);
1047} 1055}
1048void tftp::tftpACK::SetBlock(WORD b) 1056void tftp::tftpACK::SetBlock(WORD b)
1049{ 1057{
1050 block = REVERSEBYTES(b); 1058 block = REVERSEBYTES(b);
1051} 1059}
1052WORD tftp::tftpERROR::Code() 1060WORD tftp::tftpERROR::Code()
1053{ 1061{
1054 return REVERSEBYTES(code); 1062 return REVERSEBYTES(code);
1055} 1063}
1056void tftp::tftpERROR::SetCode(WORD c) 1064void tftp::tftpERROR::SetCode(WORD c)
1057{ 1065{
1058 code = REVERSEBYTES(c); 1066 code = REVERSEBYTES(c);
1059} 1067}
1060 1068
1061 1069
1062CString tftp::errMessage() 1070CString tftp::errMessage()
1063{ 1071{
1064CString rv; 1072CString rv;
1065 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) 1073 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code)))
1066 rv = (LPCTSTR)data.m_ERROR.data; 1074 rv = (LPCTSTR)data.m_ERROR.data;
1067 return rv; 1075 return rv;
1068} 1076}
1069 1077
1070void CXferSocket::Destroy(BOOL success) 1078void CXferSocket::Destroy(BOOL success)
1071{ 1079{
1072 if(m_wndResolver){ 1080 if(m_wndResolver){
1073 delete m_wndResolver; 1081 delete m_wndResolver;
1074 m_wndResolver=NULL; 1082 m_wndResolver=NULL;
1075 } 1083 }
1076 SetTry(); 1084 SetTry();
1077 m_Daddy->m_bnw.StartSound( 1085 m_Daddy->m_bnw.StartSound(
1078 success 1086 success
1079 ? m_Daddy->m_bnwSuccess 1087 ? m_Daddy->m_bnwSuccess
1080 : m_Daddy->m_bnwAbort 1088 : m_Daddy->m_bnwAbort
1081 ); 1089 );
1082 if(m_File.m_hFile!=CFile::hFileNull){ 1090 if(m_File.m_hFile!=CFile::hFileNull){
1083 TRY{ 1091 TRY{
1084 m_File.Close(); 1092 m_File.Close();
1085 }CATCH(CFileException,e){ 1093 }CATCH(CFileException,e){
1086 TRACE0("Error closing file\n"); 1094 TRACE0("Error closing file\n");
1087 }END_CATCH 1095 }END_CATCH
1088 } 1096 }
1089 ASSERT(m_Daddy); 1097 ASSERT(m_Daddy);
1090 m_Daddy->KillTimer(m_hSocket); 1098 m_Daddy->KillTimer(m_hSocket);
1091 m_Daddy->m_Xfers.RemoveKey(m_hSocket); 1099 m_Daddy->m_Xfers.RemoveKey(m_hSocket);
1092LV_FINDINFO lvf; 1100LV_FINDINFO lvf;
1093 memset(&lvf,0,sizeof(lvf)); 1101 memset(&lvf,0,sizeof(lvf));
1094 lvf.flags=LVFI_PARAM; 1102 lvf.flags=LVFI_PARAM;
1095 lvf.lParam=(LPARAM)this; 1103 lvf.lParam=(LPARAM)this;
1096int i = m_Daddy->m_List.FindItem(&lvf); 1104int i = m_Daddy->m_List.FindItem(&lvf);
1097 if(i>=0) 1105 if(i>=0)
1098 m_Daddy->m_List.DeleteItem(i); 1106 m_Daddy->m_List.DeleteItem(i);
1099 delete this; 1107 delete this;
1100} 1108}
1101 1109
1102void CPumpKINDlg::LogLine(LPCTSTR str) 1110void CPumpKINDlg::LogLine(LPCTSTR str)
1103{ 1111{
1104 ASSERT(m_LogLength); 1112 ASSERT(m_LogLength);
1105 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ 1113 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
1106 CTime *t = (CTime*)m_Log.GetItemData(0); 1114 CTime *t = (CTime*)m_Log.GetItemData(0);
1107 if(((DWORD)t)!=LB_ERR){ 1115 if(((DWORD)t)!=LB_ERR){
1108 ASSERT(t); 1116 ASSERT(t);
1109 m_LogTimes.RemoveKey(t); 1117 m_LogTimes.RemoveKey(t);
1110 delete t; 1118 delete t;
1111 } 1119 }
1112 m_Log.DeleteString(0); 1120 m_Log.DeleteString(0);
1113 } 1121 }
1114int i = m_Log.AddString(str); 1122int i = m_Log.AddString(str);
1115 ASSERT(i!=LB_ERR); 1123 ASSERT(i!=LB_ERR);
1116CTime *t = new CTime(CTime::GetCurrentTime()); 1124CTime *t = new CTime(CTime::GetCurrentTime());
1117 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); 1125 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t));
1118 m_Log.SetCurSel(i); 1126 m_Log.SetCurSel(i);
1119} 1127}
1120 1128
1121void CPumpKINDlg::LogLine(UINT msgID) 1129void CPumpKINDlg::LogLine(UINT msgID)
1122{ 1130{
1123CString tmp; 1131CString tmp;
1124 tmp.Format(msgID); 1132 tmp.Format(msgID);
1125 LogLine(tmp); 1133 LogLine(tmp);
1126} 1134}
1127 1135
1128void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) 1136void CXferSocket::TurnSlashes(CString& fn,BOOL bBack)
1129{ 1137{
1130 ints = fn.Find(bBack?'/':'\\'); 1138 ints = fn.Find(bBack?'/':'\\');
1131 while(s>=0){ 1139 while(s>=0){
1132 fn.SetAt(s,bBack?'\\':'/'); 1140 fn.SetAt(s,bBack?'\\':'/');
1133 s = fn.Find(bBack?'/':'\\'); 1141 s = fn.Find(bBack?'/':'\\');
1134 } 1142 }
1135} 1143}
1136 1144
1137CString CXferSocket::ApplyRoot(LPCTSTR fileName) 1145CString CXferSocket::ApplyRoot(LPCTSTR fileName)
1138{ 1146{
1139 ASSERT(m_Daddy); 1147 ASSERT(m_Daddy);
1140CString fn = fileName; 1148CString fn = fileName;
1141CString rv = m_Daddy->m_TFTPRoot; 1149CString rv = m_Daddy->m_TFTPRoot;
1142 if(rv.IsEmpty()) 1150 if(rv.IsEmpty())
1143 rv = "."; 1151 rv = ".";
1144 if(rv[rv.GetLength()-1]!='\\') 1152 if(rv[rv.GetLength()-1]!='\\')
1145 rv+="\\"; 1153 rv+="\\";
1146 while((!fn.IsEmpty()) && fn[0]=='\\') 1154 while((!fn.IsEmpty()) && fn[0]=='\\')
1147 fn=fn.Mid(1); 1155 fn=fn.Mid(1);
1148 rv+=fn; 1156 rv+=fn;
1149 return rv; 1157 return rv;
1150} 1158}
1151 1159
1152void CPumpKINDlg::OnOptions() 1160void CPumpKINDlg::OnOptions()
1153{ 1161{
1154CPropertySheet cps(IDS_TITLE_OPTIONS,this); 1162CPropertySheet cps(IDS_TITLE_OPTIONS,this);
1155CPropsServer server; 1163CPropsServer server;
1156CPropsNetwork network; 1164CPropsNetwork network;
1157CPropsSounds sounds; 1165CPropsSounds sounds;
1158 1166
1159 server.m_RRQMode=m_RRQMode; 1167 server.m_RRQMode=m_RRQMode;
1160 server.m_TFTPRoot=m_TFTPRoot; 1168 server.m_TFTPRoot=m_TFTPRoot;
1161 server.m_TFTPSubdirs=m_bTFTPSubdirs; 1169 server.m_TFTPSubdirs=m_bTFTPSubdirs;
1162 server.m_WRQMode=m_WRQMode; 1170 server.m_WRQMode=m_WRQMode;
1163 server.m_PromptTimeOut=m_PromptTimeOut; 1171 server.m_PromptTimeOut=m_PromptTimeOut;
1164 1172
1165 network.m_ListenPort=m_ListenPort; 1173 network.m_ListenPort=m_ListenPort;
1166 network.m_SpeakPort=m_SpeakPort; 1174 network.m_SpeakPort=m_SpeakPort;
1167 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds(); 1175 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
1168 network.m_BlockSize=m_BlockSize; 1176 network.m_BlockSize=m_BlockSize;
1169 1177
1170 sounds.m_Request = m_bnwRequest; 1178 sounds.m_Request = m_bnwRequest;
1171 sounds.m_Success = m_bnwSuccess; 1179 sounds.m_Success = m_bnwSuccess;
1172 sounds.m_Abort = m_bnwAbort; 1180 sounds.m_Abort = m_bnwAbort;
1173 1181
1174 cps.AddPage(&server); 1182 cps.AddPage(&server);
1175 cps.AddPage(&network); 1183 cps.AddPage(&network);
1176 cps.AddPage(&sounds); 1184 cps.AddPage(&sounds);
1177 if(cps.DoModal()==IDOK){ 1185 if(cps.DoModal()==IDOK){
1178 m_RRQMode=server.m_RRQMode; 1186 m_RRQMode=server.m_RRQMode;
1179 m_TFTPRoot=server.m_TFTPRoot; 1187 m_TFTPRoot=server.m_TFTPRoot;
1180 m_bTFTPSubdirs=server.m_TFTPSubdirs; 1188 m_bTFTPSubdirs=server.m_TFTPSubdirs;
1181 m_WRQMode=server.m_WRQMode; 1189 m_WRQMode=server.m_WRQMode;
1182 m_PromptTimeOut=server.m_PromptTimeOut; 1190 m_PromptTimeOut=server.m_PromptTimeOut;
1183 1191
1184 m_ListenPort=network.m_ListenPort; 1192 m_ListenPort=network.m_ListenPort;
1185 m_SpeakPort=network.m_SpeakPort; 1193 m_SpeakPort=network.m_SpeakPort;
1186 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut); 1194 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
1187 m_BlockSize=network.m_BlockSize; 1195 m_BlockSize=network.m_BlockSize;
1188 1196
1189 m_bnwRequest = sounds.m_Request; 1197 m_bnwRequest = sounds.m_Request;
1190 m_bnwSuccess = sounds.m_Success; 1198 m_bnwSuccess = sounds.m_Success;
1191 m_bnwAbort = sounds.m_Abort; 1199 m_bnwAbort = sounds.m_Abort;
1192 } 1200 }
1193} 1201}
1194 1202
1195BOOL CRRQSocket::ConfirmRequest() 1203BOOL CRRQSocket::ConfirmRequest()
1196{ 1204{
1197CConfirmRRQDlg cd(NULL); 1205CConfirmRRQDlg cd(NULL);
1198 cd.m_Daddy=this; 1206 cd.m_Daddy=this;
1199 cd.m_File=m_FileName; 1207 cd.m_File=m_FileName;
1200 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1208 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1201 if(cd.DoModal()==IDOK) 1209 if(cd.DoModal()==IDOK)
1202 return TRUE; 1210 return TRUE;
1203 return FALSE; 1211 return FALSE;
1204} 1212}
1205 1213
1206CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 1214CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
1207 : CXferSocket(daddy,fileName,type,sin) 1215 : CXferSocket(daddy,fileName,type,sin)
1208{ 1216{
1209 state=stateNone; 1217 state=stateNone;
1210 m_ACK=0; 1218 m_ACK=0;
1211 m_LastSlack=0; 1219 m_LastSlack=0;
1212 m_bResume=FALSE; 1220 m_bResume=FALSE;
1213} 1221}
1214 1222
1215BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 1223BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
1216{ 1224{
1217 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 1225 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
1218 return FALSE; 1226 return FALSE;
1219 ASSERT(m_Daddy); 1227 ASSERT(m_Daddy);
1220 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 1228 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
1221 m_Daddy->m_Xfers[m_hSocket]=this; 1229 m_Daddy->m_Xfers[m_hSocket]=this;
1222 UpdateList(); 1230 UpdateList();
1223CString lf; 1231CString lf;
1224 if(!localFile) { 1232 if(!localFile) {
1225 lf = m_FileName; 1233 lf = m_FileName;
1226 TurnSlashes(lf,TRUE); 1234 TurnSlashes(lf,TRUE);
1227 } 1235 }
1228CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); 1236CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
1229 if(!localFile){// This is an incoming request.. 1237 if(!localFile){// This is an incoming request..
1230 if(CheckBadRelativeness(m_FileName)){ 1238 if(CheckBadRelativeness(m_FileName)){
1231 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1239 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1232 return TRUE; 1240 return TRUE;
1233 } 1241 }
1234 BOOL exists; 1242 BOOL exists;
1235 if(!_access((LPCTSTR)fn,0)) 1243 if(!_access((LPCTSTR)fn,0))
1236 m_Rename=exists=TRUE; 1244 m_Rename=exists=TRUE;
1237 else 1245 else
1238 m_Rename=exists=FALSE; 1246 m_Rename=exists=FALSE;
1239 // *** m_WRQMode only if server transfer 1247 // *** m_WRQMode only if server transfer
1240 switch(m_Daddy->m_WRQMode){ 1248 switch(m_Daddy->m_WRQMode){
1241 case CPumpKINDlg::wrqTakeAll: 1249 case CPumpKINDlg::wrqTakeAll:
1242 if(exists){ 1250 if(exists){
1243 if(!RenameFile(fn)){ 1251 if(!RenameFile(fn)){
1244 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME); 1252 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
1245 return TRUE; 1253 return TRUE;
1246 } 1254 }
1247 } 1255 }
1248 break; 1256 break;
1249 case CPumpKINDlg::wrqConfirmIfExists: 1257 case CPumpKINDlg::wrqConfirmIfExists:
1250 if(!exists) 1258 if(!exists)
1251 break; 1259 break;
1252 case CPumpKINDlg::wrqAlwaysConfirm: 1260 case CPumpKINDlg::wrqAlwaysConfirm:
1253 if(exists) 1261 if(exists)
1254 m_bResume=TRUE; 1262 m_bResume=TRUE;
1255 if(ConfirmRequest()){ 1263 if(ConfirmRequest()){
1256 if(m_Rename){ 1264 if(m_Rename){
1257 RenameFile(fn); 1265 RenameFile(fn);
1258 if(SaveAs(fn)) 1266 if(SaveAs(fn))
1259 break; 1267 break;
1260 }else 1268 }else
1261 break; 1269 break;
1262 } 1270 }
1263 case CPumpKINDlg::wrqDenyAll: 1271 case CPumpKINDlg::wrqDenyAll:
1264 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1272 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1265 return TRUE; 1273 return TRUE;
1266 } 1274 }
1267 } 1275 }
1268CFileException e; 1276CFileException e;
1269 if(!m_File.Open( 1277 if(!m_File.Open(
1270 fn, 1278 fn,
1271 m_bResume 1279 m_bResume
1272 ?(CFile::modeWrite|CFile::shareDenyWrite) 1280 ?(CFile::modeWrite|CFile::shareDenyWrite)
1273 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite), 1281 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
1274 &e 1282 &e
1275 )){ 1283 )){
1276 if(localFile){// Outgoing request 1284 if(localFile){// Outgoing request
1277 CString tmp; 1285 CString tmp;
1278 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); 1286 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn);
1279 m_Daddy->LogLine(tmp); 1287 m_Daddy->LogLine(tmp);
1280 return FALSE; 1288 return FALSE;
1281 }else{ 1289 }else{
1282 Deny(&e); 1290 Deny(&e);
1283 return TRUE; 1291 return TRUE;
1284 } 1292 }
1285 } 1293 }
1286 if(hostName){ 1294 if(hostName){
1287 m_HostName=hostName; 1295 m_HostName=hostName;
1288 1296
1289 CString tmp; 1297 CString tmp;
1290 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); 1298 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName);
1291 m_Daddy->LogLine(tmp); 1299 m_Daddy->LogLine(tmp);
1292 1300
1293 CString inAddr = hostName; 1301 CString inAddr = hostName;
1294 int at = inAddr.Find('@'); 1302 int at = inAddr.Find('@');
1295 if(at>=0) 1303 if(at>=0)
1296 inAddr=inAddr.Mid(at+1); 1304 inAddr=inAddr.Mid(at+1);
1297 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 1305 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
1298 ASSERT(!m_wndResolver); 1306 ASSERT(!m_wndResolver);
1299 m_wndResolver = new CResolver(this); 1307 m_wndResolver = new CResolver(this);
1300 ASSERT(m_wndResolver); 1308 ASSERT(m_wndResolver);
1301 return m_wndResolver->Resolve(); 1309 return m_wndResolver->Resolve();
1302 }else{ 1310 }else{
1303 OnHostKnown(); 1311 OnHostKnown();
1304 return TRUE; 1312 return TRUE;
1305 } 1313 }
1306 } 1314 }
1307CString v; 1315CString v;
1308tftp::tftpOptions oack; 1316tftp::tftpOptions oack;
1309 if(m_Options.Lookup(tftpoTSize,v)){ 1317 if(m_Options.Lookup(tftpoTSize,v)){
1310 m_xferSize=atol(v); 1318 m_xferSize=atol(v);
1311 if(!m_xferSize){ 1319 if(!m_xferSize){
1312 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); 1320 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE);
1313 return TRUE; 1321 return TRUE;
1314 } 1322 }
1315 } 1323 }
1316 if(m_Options.Lookup(tftpoBSize,v)){ 1324 if(m_Options.Lookup(tftpoBSize,v)){
1317 m_blkSize=atoi(v); 1325 m_blkSize=atoi(v);
1318 if(!m_blkSize){// *** Do more about sanity check 1326 if(!m_blkSize){// *** Do more about sanity check
1319 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 1327 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
1320 return TRUE; 1328 return TRUE;
1321 } 1329 }
1322 v.Format("%u",m_blkSize); 1330 v.Format("%u",m_blkSize);
1323 oack[tftpoBSize]=v; 1331 oack[tftpoBSize]=v;
1324 } 1332 }
1325 if(m_Options.Lookup(tftpoTOut,v)){ 1333 if(m_Options.Lookup(tftpoTOut,v)){
1326 m_timeOut=atoi(v); 1334 m_timeOut=atoi(v);
1327 if(!m_timeOut){// *** Do more about sanity check 1335 if(!m_timeOut){// *** Do more about sanity check
1328 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 1336 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
1329 return TRUE; 1337 return TRUE;
1330 } 1338 }
1331 v.Format("%u",m_timeOut); 1339 v.Format("%u",m_timeOut);
1332 oack[tftpoTOut]=v; 1340 oack[tftpoTOut]=v;
1333 } 1341 }
1334 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ 1342 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){
1335 m_ACK=m_File.GetLength()/m_blkSize; 1343 m_ACK=m_File.GetLength()/m_blkSize;
1336 v.Format("%u",m_ACK); 1344 v.Format("%u",m_ACK);
1337 oack[tftpoXResume]=v; 1345 oack[tftpoXResume]=v;
1338 }else 1346 }else
1339 m_ACK=0; 1347 m_ACK=0;
1340 state=stateXfer; 1348 state=stateXfer;
1341 if(oack.GetCount()){ 1349 if(oack.GetCount()){
1342 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); 1350 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack));
1343 ASSERT(p); 1351 ASSERT(p);
1344 p->SetOpcode(tftp::opOACK); 1352 p->SetOpcode(tftp::opOACK);
1345 p->data.m_OACK.Set(&oack); 1353 p->data.m_OACK.Set(&oack);
1346 PostTFTP(p,TRUE); 1354 PostTFTP(p,TRUE);
1347 }else 1355 }else
1348 DoXfer(); 1356 DoXfer();
1349 return TRUE; 1357 return TRUE;
1350} 1358}
1351 1359
1352BOOL CWRQSocket::ConfirmRequest() 1360BOOL CWRQSocket::ConfirmRequest()
1353{ 1361{
1354CConfirmWRQDlg cd(NULL); 1362CConfirmWRQDlg cd(NULL);
1355 cd.m_Daddy=this; 1363 cd.m_Daddy=this;
1356 cd.m_File=m_FileName; 1364 cd.m_File=m_FileName;
1357 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1365 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1358 switch(cd.DoModal()){ 1366 switch(cd.DoModal()){
1359 case IDOK: 1367 case IDOK:
1360 m_Rename=FALSE; 1368 m_Rename=FALSE;
1361 m_bResume=FALSE; 1369 m_bResume=FALSE;
1362 return TRUE; 1370 return TRUE;
1363 case IDC_RENAME: 1371 case IDC_RENAME:
1364 m_bResume=FALSE; 1372 m_bResume=FALSE;
1365 m_Rename=TRUE; 1373 m_Rename=TRUE;
1366 return TRUE; 1374 return TRUE;
1367 case IDC_RESUME: 1375 case IDC_RESUME:
1368 m_Rename=FALSE; 1376 m_Rename=FALSE;
1369 m_bResume=TRUE; 1377 m_bResume=TRUE;
1370 return TRUE; 1378 return TRUE;
1371 case IDCANCEL: 1379 case IDCANCEL:
1372 return FALSE; 1380 return FALSE;
1373 } 1381 }
1374 return FALSE; 1382 return FALSE;
1375} 1383}
1376 1384
1377BOOL CWRQSocket::RenameFile(CString& fn) 1385BOOL CWRQSocket::RenameFile(CString& fn)
1378{ 1386{
1379CString renamed = fn; 1387CString renamed = fn;
1380 if(fn.IsEmpty()) 1388 if(fn.IsEmpty())
1381 return FALSE; 1389 return FALSE;
1382 if(fn[fn.GetLength()-1]==')'){ 1390 if(fn[fn.GetLength()-1]==')'){
1383 int op = fn.ReverseFind('('); 1391 int op = fn.ReverseFind('(');
1384 if(op>0 && fn[op-1]==' '){ 1392 if(op>0 && fn[op-1]==' '){
1385 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) 1393 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty())
1386 renamed = renamed.Left(op-1); 1394 renamed = renamed.Left(op-1);
1387 } 1395 }
1388 } 1396 }
1389CString testFN; 1397CString testFN;
1390 for(UINT tmp=0;tmp<32768;tmp++){ 1398 for(UINT tmp=0;tmp<32768;tmp++){
1391 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp); 1399 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp);
1392 if(!_access((LPCTSTR)testFN,0)) 1400 if(!_access((LPCTSTR)testFN,0))
1393 continue; 1401 continue;
1394 fn=testFN; 1402 fn=testFN;
1395 return TRUE; 1403 return TRUE;
1396 } 1404 }
1397 return FALSE; 1405 return FALSE;
1398} 1406}
1399 1407
1400BOOL CWRQSocket::SaveAs(CString& fn) 1408BOOL CWRQSocket::SaveAs(CString& fn)
1401{ 1409{
1402CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy); 1410CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy);
1403CString title; 1411CString title;
1404 title.LoadString(IDS_RENAME_TITLE); 1412 title.LoadString(IDS_RENAME_TITLE);
1405 cfd.m_ofn.lpstrTitle=(LPCTSTR)title; 1413 cfd.m_ofn.lpstrTitle=(LPCTSTR)title;
1406 if(cfd.DoModal()!=IDOK) 1414 if(cfd.DoModal()!=IDOK)
1407 return FALSE; 1415 return FALSE;
1408 fn = cfd.GetPathName(); 1416 fn = cfd.GetPathName();
1409 return TRUE; 1417 return TRUE;
1410} 1418}
1411 1419
1412void CWRQSocket::DoXfer() 1420void CWRQSocket::DoXfer()
1413{ 1421{
1414tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize()); 1422tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize());
1415 ASSERT(p); 1423 ASSERT(p);
1416 p->SetOpcode(tftp::opACK); 1424 p->SetOpcode(tftp::opACK);
1417 p->data.m_ACK.SetBlock(m_ACK); 1425 p->data.m_ACK.SetBlock(m_ACK);
1418 TRACE1("WRQ-ACK-%u\n",m_ACK); 1426 TRACE1("WRQ-ACK-%u\n",m_ACK);
1419 PostTFTP(p,TRUE);// *** ??? Hope this is right 1427 PostTFTP(p,TRUE);// *** ??? Hope this is right
1420} 1428}
1421 1429
1422UINT tftp::tftpACK::tftpSize() 1430UINT tftp::tftpACK::tftpSize()
1423{ 1431{
1424 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK); 1432 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK);
1425} 1433}
1426 1434
1427ULONG CWRQSocket::GetACK() 1435ULONG CWRQSocket::GetACK()
1428{ 1436{
1429 return (m_ACK*m_blkSize)-m_LastSlack; 1437 return (m_ACK*m_blkSize)-m_LastSlack;
1430} 1438}
1431 1439
1432void CXferSocket::ResetTimeout() 1440void CXferSocket::ResetTimeout()
1433{ 1441{
1434 ASSERT(m_Daddy); 1442 ASSERT(m_Daddy);
1435 m_Daddy->m_Retrier->KillTimer(m_hSocket); 1443 m_Daddy->m_Retrier->KillTimer(m_hSocket);
1436 if(m_Retry) 1444 if(m_Retry)
1437 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL); 1445 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL);
1438 if(!m_bRetry){ 1446 if(!m_bRetry){
1439 m_Daddy->KillTimer(m_hSocket); 1447 m_Daddy->KillTimer(m_hSocket);
1440 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL); 1448 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL);
1441 } 1449 }
1442} 1450}
1443 1451
1444void CXferSocket::Abort() 1452void CXferSocket::Abort()
1445{ 1453{
1446 ASSERT(m_Daddy); 1454 ASSERT(m_Daddy);
1447CString tmp; 1455CString tmp;
1448 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName); 1456 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName);
1449 m_Daddy->LogLine(tmp); 1457 m_Daddy->LogLine(tmp);
1450 Destroy(FALSE); 1458 Destroy(FALSE);
1451} 1459}
1452 1460
1453void CPumpKINDlg::OnTimer(UINT nIDEvent) 1461void CPumpKINDlg::OnTimer(UINT nIDEvent)
1454{ 1462{
1455CXferSocket *socket; 1463CXferSocket *socket;
1456 if(m_Xfers.Lookup(nIDEvent,socket)){ 1464 if(m_Xfers.Lookup(nIDEvent,socket)){
1457 CString tmp; 1465 CString tmp;
1458 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName); 1466 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName);
1459 LogLine(tmp); 1467 LogLine(tmp);
1460 socket->Abort(); 1468 socket->Abort();
1461 }else{ 1469 }else{
1462 TRACE0("Failed to find timed out socket!\n"); 1470 TRACE0("Failed to find timed out socket!\n");
1463 } 1471 }
1464 CDialog::OnTimer(nIDEvent); 1472 CDialog::OnTimer(nIDEvent);
1465} 1473}
1466 1474
1467void CPumpKINDlg::OnExit() 1475void CPumpKINDlg::OnExit()
1468{ 1476{
1469 if(!m_Xfers.IsEmpty()){ 1477 if(!m_Xfers.IsEmpty()){
1470 CString title,text; 1478 CString title,text;
1471 title.LoadString(IDS_CONFIRMEXIT_TITLE); 1479 title.LoadString(IDS_CONFIRMEXIT_TITLE);
1472 text.LoadString(IDS_CONFIRMEXIT_TEXT); 1480 text.LoadString(IDS_CONFIRMEXIT_TEXT);
1473 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES) 1481 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES)
1474 return; 1482 return;
1475 } 1483 }
1476 m_bExiting=TRUE; 1484 m_bExiting=TRUE;
1477 EndDialog(IDOK); 1485 EndDialog(IDOK);
1478} 1486}
1479 1487
1480void CPumpKINDlg::OnPut() 1488void CPumpKINDlg::OnPut()
1481{ 1489{
1482CRequestDlg crd(NULL); 1490CRequestDlg crd(NULL);
1483 crd.m_Put=TRUE; 1491 crd.m_Put=TRUE;
1484 crd.m_BSize=m_BlockSize; 1492 crd.m_BSize=m_BlockSize;
1485 if(crd.DoModal()==IDOK){ 1493 if(crd.DoModal()==IDOK){
1486 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1494 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1487 if(crd.m_BSize) 1495 if(crd.m_BSize)
1488 socket->m__blkSize=crd.m_BSize; 1496 socket->m__blkSize=crd.m_BSize;
1489 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1497 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1490 socket->Destroy(); 1498 socket->Destroy();
1491 } 1499 }
1492} 1500}
1493 1501
1494void CPumpKINDlg::OnGet() 1502void CPumpKINDlg::OnGet()
1495{ 1503{
1496CRequestDlg crd(NULL); 1504CRequestDlg crd(NULL);
1497 crd.m_Put=FALSE; 1505 crd.m_Put=FALSE;
1498 crd.m_BSize=m_BlockSize; 1506 crd.m_BSize=m_BlockSize;
1499 if(crd.DoModal()==IDOK){ 1507 if(crd.DoModal()==IDOK){
1500 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1508 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1501 if(crd.m_BSize) 1509 if(crd.m_BSize)
1502 socket->m__blkSize=crd.m_BSize; 1510 socket->m__blkSize=crd.m_BSize;
1503 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1511 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1504 socket->Destroy(); 1512 socket->Destroy();
1505 } 1513 }
1506} 1514}
1507 1515
1508void CPumpKINDlg::SetupButtons() 1516void CPumpKINDlg::SetupButtons()
1509{ 1517{
1510 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0); 1518 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0);
1511} 1519}
1512 1520
1513void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult) 1521void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult)
1514{ 1522{
1515 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1523 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1516 SetupButtons(); 1524 SetupButtons();
1517 *pResult = 0; 1525 *pResult = 0;
1518} 1526}
1519 1527
1520void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1528void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1521{ 1529{
1522 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1530 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1523 SetupButtons(); 1531 SetupButtons();
1524 *pResult = 0; 1532 *pResult = 0;
1525} 1533}
1526 1534
1527void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1535void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1528{ 1536{
1529 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1537 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1530 SetupButtons(); 1538 SetupButtons();
1531 *pResult = 0; 1539 *pResult = 0;
1532} 1540}
1533 1541
1534void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult) 1542void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult)
1535{ 1543{
1536 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1544 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1537 SetupButtons(); 1545 SetupButtons();
1538 *pResult = 0; 1546 *pResult = 0;
1539} 1547}
1540 1548
1541void CPumpKINDlg::OnAbort() 1549void CPumpKINDlg::OnAbort()
1542{ 1550{
1543 if(!m_List.GetSelectedCount()) 1551 if(!m_List.GetSelectedCount())
1544 return; 1552 return;
1545 intitems = m_List.GetItemCount(); 1553 intitems = m_List.GetItemCount();
1546 for(int tmp=0;tmp<items;tmp++){ 1554 for(int tmp=0;tmp<items;tmp++){
1547 if(!(m_List.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED)) 1555 if(!(m_List.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED))
1548 continue; 1556 continue;
1549 CXferSocket *xfer = (CXferSocket*) m_List.GetItemData(tmp); 1557 CXferSocket *xfer = (CXferSocket*) m_List.GetItemData(tmp);
1550 ASSERT(xfer); 1558 ASSERT(xfer);
1551 xfer->Abort(); 1559 xfer->Abort();
1552 } 1560 }
1553} 1561}
1554 1562
1555void CXferSocket::OnFailedToResolve() 1563void CXferSocket::OnFailedToResolve()
1556{ 1564{
1557 TRACE0("Resolve failed\n"); 1565 TRACE0("Resolve failed\n");
1558 delete m_wndResolver; 1566 delete m_wndResolver;
1559 m_wndResolver=NULL; 1567 m_wndResolver=NULL;
1560 ASSERT(m_Daddy); 1568 ASSERT(m_Daddy);
1561CString tmp; 1569CString tmp;
1562 tmp.Format(IDS_LOG_RESOLVEFAILED,m_HostName); 1570 tmp.Format(IDS_LOG_RESOLVEFAILED,m_HostName);
1563 m_Daddy->LogLine(tmp); 1571 m_Daddy->LogLine(tmp);
1564 Abort(); 1572 Abort();
1565} 1573}
1566 1574
1567void CXferSocket::OnResolved() 1575void CXferSocket::OnResolved()
1568{ 1576{
1569 delete m_wndResolver; 1577 delete m_wndResolver;
1570 m_wndResolver=NULL; 1578 m_wndResolver=NULL;
1571 TRACE0("Resolved\n"); 1579 TRACE0("Resolved\n");
1572 m_Peer.sin_addr.s_addr = *(DWORD*)(((hostent*)m_ResolveBuff)->h_addr); 1580 m_Peer.sin_addr.s_addr = *(DWORD*)(((hostent*)m_ResolveBuff)->h_addr);
1573} 1581}
1574 1582
1575void CRRQSocket::OnResolved() 1583void CRRQSocket::OnResolved()
1576{ 1584{
1577 CXferSocket::OnResolved(); 1585 CXferSocket::OnResolved();
1578 OnHostKnown(); 1586 OnHostKnown();
1579} 1587}
1580 1588
1581void CRRQSocket::OnHostKnown() 1589void CRRQSocket::OnHostKnown()
1582{ 1590{
1583 ASSERT(m_Daddy); 1591 ASSERT(m_Daddy);
1584 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort); 1592 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort);
1585tftp::tftpOptions o; 1593tftp::tftpOptions o;
1586CString v; 1594CString v;
1587 ASSERT(m_xferSize>=0); 1595 ASSERT(m_xferSize>=0);
1588 v.Format("%lu",m_xferSize); 1596 v.Format("%lu",m_xferSize);
1589 o[tftpoTSize] = v; 1597 o[tftpoTSize] = v;
1590 ASSERT(m__blkSize); 1598 ASSERT(m__blkSize);
1591 v.Format("%u",m__blkSize); 1599 v.Format("%u",m__blkSize);
1592 o[tftpoBSize] = v; 1600 o[tftpoBSize] = v;
1593 ASSERT(m__timeOut); 1601 ASSERT(m__timeOut);
1594 v.Format("%u",m__timeOut); 1602 v.Format("%u",m__timeOut);
1595 o[tftpoTOut] = v; 1603 o[tftpoTOut] = v;
1596 o[tftpoXResume] = "0"; 1604 o[tftpoXResume] = "0";
1597 tftp*p = tftp::Allocate(tftp::tftpWRQ::tftpSize(m_FileName,m_Type,&o)); 1605 tftp*p = tftp::Allocate(tftp::tftpWRQ::tftpSize(m_FileName,m_Type,&o));
1598 ASSERT(p); 1606 ASSERT(p);
1599 p->SetOpcode(tftp::opWRQ); 1607 p->SetOpcode(tftp::opWRQ);
1600 p->data.m_WRQ.Set(m_FileName,m_Type,&o); 1608 p->data.m_WRQ.Set(m_FileName,m_Type,&o);
1601 PostTFTP(p,TRUE); 1609 PostTFTP(p,TRUE);
1602 state=stateInit; 1610 state=stateInit;
1603 UpdateList(); 1611 UpdateList();
1604} 1612}
1605 1613
1606UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1614UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1607{ 1615{
1608UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1; 1616UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1;
1609 if(ops){ 1617 if(ops){
1610 tftpOptions& o = *ops; 1618 tftpOptions& o = *ops;
1611 POSITION p = o.GetStartPosition(); 1619 POSITION p = o.GetStartPosition();
1612 while(p){ 1620 while(p){
1613 CString n,v; 1621 CString n,v;
1614 o.GetNextAssoc(p,n,v); 1622 o.GetNextAssoc(p,n,v);
1615 rv+=n.GetLength()+1+v.GetLength()+1; 1623 rv+=n.GetLength()+1+v.GetLength()+1;
1616 } 1624 }
1617 } 1625 }
1618 return rv; 1626 return rv;
1619} 1627}
1620UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1628UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1621{ 1629{
1622 return tftp::tftpRQ::tftpSize(file,type,ops); 1630 return tftp::tftpRQ::tftpSize(file,type,ops);
1623} 1631}
1624UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1632UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1625{ 1633{
1626 return tftp::tftpRQ::tftpSize(file,type,ops); 1634 return tftp::tftpRQ::tftpSize(file,type,ops);
1627} 1635}
1628UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops) 1636UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops)
1629{ 1637{
1630UINT rv = tftpHdrSize-tftpSlackSize; 1638UINT rv = tftpHdrSize-tftpSlackSize;
1631 if(ops){ 1639 if(ops){
1632 tftpOptions& o = *ops; 1640 tftpOptions& o = *ops;
1633 POSITION p = o.GetStartPosition(); 1641 POSITION p = o.GetStartPosition();
1634 while(p){ 1642 while(p){
1635 CString n,v; 1643 CString n,v;
1636 o.GetNextAssoc(p,n,v); 1644 o.GetNextAssoc(p,n,v);
1637 rv+=n.GetLength()+1+v.GetLength()+1; 1645 rv+=n.GetLength()+1+v.GetLength()+1;
1638 } 1646 }
1639 } 1647 }
1640 return rv; 1648 return rv;
1641} 1649}
1642void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1650void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1643{ 1651{
1644 // MAY BE DANGEROUS! 1652 // MAY BE DANGEROUS!
1645UINT ptr = 0; 1653UINT ptr = 0;
1646 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1654 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1647 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1655 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1648 if(ops){ 1656 if(ops){
1649 tftpOptions& o = *ops; 1657 tftpOptions& o = *ops;
1650 POSITION p = o.GetStartPosition(); 1658 POSITION p = o.GetStartPosition();
1651 while(p){ 1659 while(p){
1652 CString n,v; 1660 CString n,v;
1653 o.GetNextAssoc(p,n,v); 1661 o.GetNextAssoc(p,n,v);
1654 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1662 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1655 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1663 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1656 } 1664 }
1657 } 1665 }
1658} 1666}
1659void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1667void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1660{ 1668{
1661 // MAY BE DANGEROUS! 1669 // MAY BE DANGEROUS!
1662UINT ptr = 0; 1670UINT ptr = 0;
1663 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1671 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1664 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1672 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1665 if(ops){ 1673 if(ops){
1666 tftpOptions& o = *ops; 1674 tftpOptions& o = *ops;
1667 POSITION p = o.GetStartPosition(); 1675 POSITION p = o.GetStartPosition();
1668 while(p){ 1676 while(p){
1669 CString n,v; 1677 CString n,v;
1670 o.GetNextAssoc(p,n,v); 1678 o.GetNextAssoc(p,n,v);
1671 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1679 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1672 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1680 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1673 } 1681 }
1674 } 1682 }
1675} 1683}
1676void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1684void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1677{ 1685{
1678 // MAY BE DANGEROUS! 1686 // MAY BE DANGEROUS!
1679UINT ptr = 0; 1687UINT ptr = 0;
1680 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1688 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1681 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1689 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1682 if(ops){ 1690 if(ops){
1683 tftpOptions& o = *ops; 1691 tftpOptions& o = *ops;
1684 POSITION p = o.GetStartPosition(); 1692 POSITION p = o.GetStartPosition();
1685 while(p){ 1693 while(p){
1686 CString n,v; 1694 CString n,v;
1687 o.GetNextAssoc(p,n,v); 1695 o.GetNextAssoc(p,n,v);
1688 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1696 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1689 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1697 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1690 } 1698 }
1691 } 1699 }
1692} 1700}
1693void tftp::tftpOACK::Set(tftpOptions* ops) 1701void tftp::tftpOACK::Set(tftpOptions* ops)
1694{ 1702{
1695 ASSERT(ops); 1703 ASSERT(ops);
1696UINT ptr = 0; 1704UINT ptr = 0;
1697tftpOptions& o = *ops; 1705tftpOptions& o = *ops;
1698POSITION p = o.GetStartPosition(); 1706POSITION p = o.GetStartPosition();
1699 while(p){ 1707 while(p){
1700 CString n,v; 1708 CString n,v;
1701 o.GetNextAssoc(p,n,v); 1709 o.GetNextAssoc(p,n,v);
1702 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1710 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1703 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1711 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1704 } 1712 }
1705} 1713}
1706 1714
1707void CWRQSocket::OnResolved() 1715void CWRQSocket::OnResolved()
1708{ 1716{
1709 CXferSocket::OnResolved(); 1717 CXferSocket::OnResolved();
1710 OnHostKnown(); 1718 OnHostKnown();
1711} 1719}
1712 1720
1713void CWRQSocket::OnHostKnown() 1721void CWRQSocket::OnHostKnown()
1714{ 1722{
1715 ASSERT(m_Daddy); 1723 ASSERT(m_Daddy);
1716 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort); 1724 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort);
1717tftp::tftpOptions o; 1725tftp::tftpOptions o;
1718CString v; 1726CString v;
1719 o[tftpoTSize]="0"; 1727 o[tftpoTSize]="0";
1720 if(m__blkSize){ 1728 if(m__blkSize){
1721 v.Format("%u",m__blkSize); 1729 v.Format("%u",m__blkSize);
1722 o[tftpoBSize]=v; 1730 o[tftpoBSize]=v;
1723 } 1731 }
1724 if(m__timeOut){ 1732 if(m__timeOut){
1725 v.Format("%u",m__timeOut); 1733 v.Format("%u",m__timeOut);
1726 o[tftpoTOut]=v; 1734 o[tftpoTOut]=v;
1727 } 1735 }
1728 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o)); 1736 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o));
1729 ASSERT(p); 1737 ASSERT(p);
1730 p->SetOpcode(tftp::opRRQ); 1738 p->SetOpcode(tftp::opRRQ);
1731 p->data.m_RRQ.Set(m_FileName,m_Type,&o); 1739 p->data.m_RRQ.Set(m_FileName,m_Type,&o);
1732 PostTFTP(p,TRUE); 1740 PostTFTP(p,TRUE);
1733 state=stateInit; 1741 state=stateInit;
1734 UpdateList(); 1742 UpdateList();
1735} 1743}
1736 1744
1737void CPumpKINDlg::OnClose() 1745void CPumpKINDlg::OnClose()
1738{ 1746{
1739 OnTrayShowpumpkinwindow(); 1747 OnTrayShowpumpkinwindow();
1740} 1748}
1741 1749
1742void CPumpKINDlg::OnTrayShowpumpkinwindow() 1750void CPumpKINDlg::OnTrayShowpumpkinwindow()
1743{ 1751{
1744 if(IsWindowVisible()){ 1752 if(IsWindowVisible()){
1745 m_bShown=FALSE; 1753 m_bShown=FALSE;
1746 ShowWindow(SW_HIDE); 1754 ShowWindow(SW_HIDE);
1747 }else{ 1755 }else{
1748 m_bShown=TRUE; 1756 m_bShown=TRUE;
1749 ShowWindow(SW_SHOW); 1757 ShowWindow(SW_SHOW);
1750 SetForegroundWindow(); 1758 SetForegroundWindow();
1751 SetFocus(); 1759 SetFocus();
1752 } 1760 }
1753} 1761}
1754 1762
1755void CPumpKINDlg::OnTrayExit() 1763void CPumpKINDlg::OnTrayExit()
1756{ 1764{
1757 OnExit(); 1765 OnExit();
1758} 1766}
1759 1767
1760void CPumpKINDlg::OnTrayAboutpumpkin() 1768void CPumpKINDlg::OnTrayAboutpumpkin()
1761{ 1769{
1762CAboutDlg dlgAbout; 1770CAboutDlg dlgAbout;
1763 dlgAbout.DoModal(); 1771 dlgAbout.DoModal();
1764} 1772}
1765 1773
1766void CPumpKINDlg::OnTrayFetchfile() 1774void CPumpKINDlg::OnTrayFetchfile()
1767{ 1775{
1768 OnGet(); 1776 OnGet();
1769} 1777}
1770 1778
1771void CPumpKINDlg::OnTrayHelp() 1779void CPumpKINDlg::OnTrayHelp()
1772{ 1780{
1773 OnHelp(); 1781 OnHelp();
1774} 1782}
1775 1783
1776void CPumpKINDlg::OnTrayOptions() 1784void CPumpKINDlg::OnTrayOptions()
1777{ 1785{
1778 OnOptions(); 1786 OnOptions();
1779} 1787}
1780 1788
1781void CPumpKINDlg::OnTraySendfile() 1789void CPumpKINDlg::OnTraySendfile()
1782{ 1790{
1783 OnPut(); 1791 OnPut();
1784} 1792}
1785 1793
1786void CPumpKINDlg::LoadSettings() 1794void CPumpKINDlg::LoadSettings()
1787{ 1795{
1788CWinApp *app = AfxGetApp(); 1796CWinApp *app = AfxGetApp();
1789 ASSERT(app); 1797 ASSERT(app);
1790 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest); 1798 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
1791 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess); 1799 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
1792 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort); 1800 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort);
1793 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1801 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1794 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1802 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1795 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength); 1803 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength);
1796 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1804 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1797 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1805 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1798 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1806 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1799 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1807 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1800 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds())); 1808 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
1801 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1809 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1802 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds())); 1810 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()));
1803 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1811 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1804 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown); 1812 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown);
1805 if(m_TFTPRoot.IsEmpty()){ 1813 if(m_TFTPRoot.IsEmpty()){
1806 DWORD dL = ::GetCurrentDirectory(0,NULL); 1814 DWORD dL = ::GetCurrentDirectory(0,NULL);
1807 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL))); 1815 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL)));
1808 m_TFTPRoot.ReleaseBuffer(); 1816 m_TFTPRoot.ReleaseBuffer();
1809 } 1817 }
1810 ::SetCurrentDirectory(m_TFTPRoot); 1818 ::SetCurrentDirectory(m_TFTPRoot);
1811} 1819}
1812 1820
1813void CPumpKINDlg::SaveSettings() 1821void CPumpKINDlg::SaveSettings()
1814{ 1822{
1815CWinApp *app = AfxGetApp(); 1823CWinApp *app = AfxGetApp();
1816 ASSERT(app); 1824 ASSERT(app);
1817 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest); 1825 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
1818 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess); 1826 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
1819 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort); 1827 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort);
1820 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1828 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1821 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1829 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1822 app->WriteProfileInt("UISettings","LogLength",m_LogLength); 1830 app->WriteProfileInt("UISettings","LogLength",m_LogLength);
1823 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1831 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1824 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1832 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1825 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1833 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1826 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1834 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1827 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()); 1835 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
1828 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1836 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1829 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()); 1837 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds());
1830 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1838 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1831 app->WriteProfileInt("UISettings","Visble",m_bShown); 1839 app->WriteProfileInt("UISettings","Visble",m_bShown);
1832} 1840}
1833 1841
1834void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 1842void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
1835{ 1843{
1836 CDialog::OnWindowPosChanging(lpwndpos); 1844 CDialog::OnWindowPosChanging(lpwndpos);
1837 if(!m_bExiting){ 1845 if(!m_bExiting){
1838 if(m_bShown){ 1846 if(m_bShown){
1839 lpwndpos->flags&=~SWP_HIDEWINDOW; 1847 lpwndpos->flags&=~SWP_HIDEWINDOW;
1840 lpwndpos->flags|=SWP_SHOWWINDOW; 1848 lpwndpos->flags|=SWP_SHOWWINDOW;
1841 }else{ 1849 }else{
1842 lpwndpos->flags&=~SWP_SHOWWINDOW; 1850 lpwndpos->flags&=~SWP_SHOWWINDOW;
1843 lpwndpos->flags|=SWP_HIDEWINDOW; 1851 lpwndpos->flags|=SWP_HIDEWINDOW;
1844 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu)) 1852 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu))
1845 GetDesktopWindow()->SetForegroundWindow(); 1853 GetDesktopWindow()->SetForegroundWindow();
1846 } 1854 }
1847 } 1855 }
1848} 1856}
1849 1857
1850CString CXferSocket::ApplyRootGently(LPCTSTR fn) 1858CString CXferSocket::ApplyRootGently(LPCTSTR fn)
1851{ 1859{
1852CString f = fn; 1860CString f = fn;
1853CString rv = f; 1861CString rv = f;
1854 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0) 1862 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0)
1855 rv = ApplyRoot(f); 1863 rv = ApplyRoot(f);
1856 return rv; 1864 return rv;
1857} 1865}
1858 1866
1859BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file) 1867BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file)
1860{ 1868{
1861CString tmp = file; 1869CString tmp = file;
1862 if(tmp.IsEmpty()) 1870 if(tmp.IsEmpty())
1863 return FALSE; 1871 return FALSE;
1864 if(tmp.Find("..")>=0) 1872 if(tmp.Find("..")>=0)
1865 return TRUE; 1873 return TRUE;
1866 if(tmp.Find(":")>=0) 1874 if(tmp.Find(":")>=0)
1867 return TRUE; 1875 return TRUE;
1868 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0) 1876 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0)
1869 return TRUE; 1877 return TRUE;
1870 return FALSE; 1878 return FALSE;
1871} 1879}
1872 1880
1873void CAboutDlg::OnKlevernet() 1881void CAboutDlg::OnKlevernet()
1874{ 1882{
1875CString url; 1883CString url;
1876 url.LoadString(IDS_KLEVERNET_URL); 1884 url.LoadString(IDS_KLEVERNET_URL);
1877 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED); 1885 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED);
1878} 1886}
1879 1887
1880BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg) 1888BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg)
1881{ 1889{
1882 // CG: The following block was added by the ToolTips component. 1890 // CG: The following block was added by the ToolTips component.
1883 { 1891 {
1884 // Let the ToolTip process this message. 1892 // Let the ToolTip process this message.
1885 m_tooltip.RelayEvent(pMsg); 1893 m_tooltip.RelayEvent(pMsg);
1886 1894
1887 return CDialog::PreTranslateMessage(pMsg); 1895 return CDialog::PreTranslateMessage(pMsg);
1888 } 1896 }
1889} 1897}
1890 1898
1891void CPumpKINDlg::OnSelchangeLog() 1899void CPumpKINDlg::OnSelchangeLog()
1892{ 1900{
1893int sel = m_Log.GetCurSel(); 1901int sel = m_Log.GetCurSel();
1894 if(sel==LB_ERR){ 1902 if(sel==LB_ERR){
1895 TRACE0("Error retrieving selection\n"); 1903 TRACE0("Error retrieving selection\n");
1896 }else{ 1904 }else{
1897 CTime *t = (CTime*)m_Log.GetItemData(sel); 1905 CTime *t = (CTime*)m_Log.GetItemData(sel);
1898 ASSERT(t); 1906 ASSERT(t);
1899 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log); 1907 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log);
1900 } 1908 }
1901} 1909}
1902 1910
1903void CPumpKINDlg::OnTrayOpenfilesfolder() 1911void CPumpKINDlg::OnTrayOpenfilesfolder()
1904{ 1912{
1905 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT); 1913 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT);
1906} 1914}
1907 1915
1908void CPumpKINDlg::OnDropFiles(HDROP hDropInfo) 1916void CPumpKINDlg::OnDropFiles(HDROP hDropInfo)
1909{ 1917{
1910UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); 1918UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
1911 ASSERT(files); 1919 ASSERT(files);
1912 for(UINT file=0;file<files;file++){ 1920 for(UINT file=0;file<files;file++){
1913 CString theFile; 1921 CString theFile;
1914 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0); 1922 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0);
1915 ASSERT(fileNameLength); 1923 ASSERT(fileNameLength);
1916 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength); 1924 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength);
1917 theFile.ReleaseBuffer(); 1925 theFile.ReleaseBuffer();
1918 // Send it over! 1926 // Send it over!
1919 CRequestDlg crd(NULL); 1927 CRequestDlg crd(NULL);
1920 crd.m_Drop=TRUE; 1928 crd.m_Drop=TRUE;
1921 crd.m_Put=TRUE; 1929 crd.m_Put=TRUE;
1922 crd.m_BSize=m_BlockSize; 1930 crd.m_BSize=m_BlockSize;
1923 crd.m_LocalFile=theFile; 1931 crd.m_LocalFile=theFile;
1924 if(crd.DoModal()==IDOK){ 1932 if(crd.DoModal()==IDOK){
1925 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1933 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1926 if(crd.m_BSize) 1934 if(crd.m_BSize)
1927 socket->m__blkSize=crd.m_BSize; 1935 socket->m__blkSize=crd.m_BSize;
1928 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1936 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1929 socket->Destroy(); 1937 socket->Destroy();
1930 } 1938 }
1931 } 1939 }
1932 ::DragFinish(hDropInfo); 1940 ::DragFinish(hDropInfo);
1933} 1941}
1934 1942
1935void CPumpKINDlg::OnCancel() 1943void CPumpKINDlg::OnCancel()
1936{ 1944{
1937 OnClose(); 1945 OnClose();
1938} 1946}
1939 1947
1940CPumpKINDlg::~CPumpKINDlg() 1948CPumpKINDlg::~CPumpKINDlg()
1941{ 1949{
1942 delete m_Trayer; 1950 delete m_Trayer;
1943 delete m_Retrier; 1951 delete m_Retrier;
1944} 1952}
1945 1953
1946void CXferSocket::OnRetry() 1954void CXferSocket::OnRetry()
1947{ 1955{
1948 if(!m_Retry){ 1956 if(!m_Retry){
1949 TRACE("Retrying unretriable..\n"); 1957 TRACE("Retrying unretriable..\n");
1950 return; 1958 return;
1951 } 1959 }
1952 TRACE0("Retrying..\n"); 1960 TRACE0("Retrying..\n");
1953 m_bRetry=TRUE; 1961 m_bRetry=TRUE;
1954 PostTFTP(tftp::Copy(m_Retry)); 1962 PostTFTP(tftp::Copy(m_Retry));
1955 m_bRetry=FALSE; 1963 m_bRetry=FALSE;
1956} 1964}
1957 1965
1958tftp* tftp::Copy(tftp *src) 1966tftp* tftp::Copy(tftp *src)
1959{ 1967{
1960 ASSERT(src); 1968 ASSERT(src);
1961 ASSERT(src->length); 1969 ASSERT(src->length);
1962tftp* rv = Allocate(src->length); 1970tftp* rv = Allocate(src->length);
1963 ASSERT(rv); 1971 ASSERT(rv);
1964 memmove(rv,src,tftpSlackSize+src->length); 1972 memmove(rv,src,tftpSlackSize+src->length);
1965 return rv; 1973 return rv;
1966} 1974}
1967 1975
1968void CXferSocket::SetTry(tftp *p) 1976void CXferSocket::SetTry(tftp *p)
1969{ 1977{
1970 if(m_Retry) 1978 if(m_Retry)
1971 delete m_Retry; 1979 delete m_Retry;
1972 m_Retry=p?tftp::Copy(p):NULL; 1980 m_Retry=p?tftp::Copy(p):NULL;
1973} 1981}
1974 1982
1975void CPumpKINDlg::OnHelp() 1983void CPumpKINDlg::OnHelp()
1976{ 1984{
1977 AfxGetApp()->WinHelp(0,HELP_FINDER); 1985 AfxGetApp()->WinHelp(0,HELP_FINDER);
1978} 1986}