summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
authorMichael Krelin <hacker@klever.net>2004-11-03 21:50:28 (UTC)
committer Michael Krelin <hacker@klever.net>2004-11-03 21:50:28 (UTC)
commit5f552506513653f08acc6921b8c158489a7ebbbb (patch) (unidiff)
tree74ab06cf90c488915b87f48e74359554521cbec9 /PumpKINDlg.cpp
parent4435ed85c3acb4df42135e009b133fb8e9d2f09c (diff)
downloadpumpkin-5f552506513653f08acc6921b8c158489a7ebbbb.zip
pumpkin-5f552506513653f08acc6921b8c158489a7ebbbb.tar.gz
pumpkin-5f552506513653f08acc6921b8c158489a7ebbbb.tar.bz2
Added dialog box in case we can't bind listening socket.
git-svn-id: http://svn.klever.net/kin/pumpkin/trunk@47 fe716a7a-6dde-0310-88d9-d003556173a8
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--PumpKINDlg.cpp1
1 files changed, 1 insertions, 0 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index 0b3bf41..fc24596 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -1,1977 +1,1978 @@
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 return -1; 331 return -1;
331 } 332 }
332 333
333 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)){
334 TRACE0("Failed to create trayer\n"); 335 TRACE0("Failed to create trayer\n");
335 return -1; 336 return -1;
336 } 337 }
337 338
338NOTIFYICONDATA nid; 339NOTIFYICONDATA nid;
339 memset(&nid,0,sizeof(nid)); 340 memset(&nid,0,sizeof(nid));
340 nid.cbSize=sizeof(nid); 341 nid.cbSize=sizeof(nid);
341 nid.hWnd=m_Trayer->m_hWnd; 342 nid.hWnd=m_Trayer->m_hWnd;
342 nid.uID=IDC_TRAYICON; 343 nid.uID=IDC_TRAYICON;
343 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; 344 nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
344 nid.uCallbackMessage=WM_TRAYICON; 345 nid.uCallbackMessage=WM_TRAYICON;
345 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); 346 nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
346 // *** Load from resource 347 // *** Load from resource
347 strcpy(nid.szTip,"PumpKIN"); 348 strcpy(nid.szTip,"PumpKIN");
348 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid)); 349 VERIFY(Shell_NotifyIcon(NIM_ADD,&nid));
349 350
350 return 0; 351 return 0;
351} 352}
352 353
353void CListenSocket::OnReceive(int nErrorCode) 354void CListenSocket::OnReceive(int nErrorCode)
354{ 355{
355 ASSERT(m_Daddy); 356 ASSERT(m_Daddy);
356 if(nErrorCode){ 357 if(nErrorCode){
357 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR); 358 m_Daddy->LogLine(IDS_LOG_LISTENRECEIVEERROR);
358 return; 359 return;
359 } 360 }
360DWORD fionread = 0; 361DWORD fionread = 0;
361 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired 362 VERIFY(IOCtl(FIONREAD,&fionread));// *** Do some checking on the value acquired
362tftp *tftpRQ = tftp::Allocate(fionread); 363tftp *tftpRQ = tftp::Allocate(fionread);
363 ASSERT(tftpRQ); 364 ASSERT(tftpRQ);
364SOCKADDR_IN sin; 365SOCKADDR_IN sin;
365 if(!tftpRQ->Receive(this,fionread,&sin)){ 366 if(!tftpRQ->Receive(this,fionread,&sin)){
366 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR); 367 m_Daddy->LogLine(IDS_LOG_LISTENACCEPTERROR);
367 delete tftpRQ; 368 delete tftpRQ;
368 return; 369 return;
369 } 370 }
370 #ifndefNDEBUG 371 #ifndefNDEBUG
371CString tmp; 372CString tmp;
372 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);
373 TRACE0(tmp); 374 TRACE0(tmp);
374#endif 375#endif
375POSITION p = m_Daddy->m_Xfers.GetStartPosition(); 376POSITION p = m_Daddy->m_Xfers.GetStartPosition();
376 while(p){ 377 while(p){
377 SOCKET key; 378 SOCKET key;
378 CXferSocket *sock; 379 CXferSocket *sock;
379 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock); 380 m_Daddy->m_Xfers.GetNextAssoc(p,key,sock);
380 ASSERT(sock); 381 ASSERT(sock);
381 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){
382 TRACE0("Ignoring request which we are already processing\n"); 383 TRACE0("Ignoring request which we are already processing\n");
383 delete tftpRQ; 384 delete tftpRQ;
384 return; 385 return;
385 } 386 }
386 } 387 }
387 switch(tftpRQ->Opcode()){ 388 switch(tftpRQ->Opcode()){
388 case tftp::opRRQ: 389 case tftp::opRRQ:
389 // Read Request 390 // Read Request
390 { 391 {
391 CString tmp; 392 CString tmp;
392 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));
393 m_Daddy->LogLine(tmp); 394 m_Daddy->LogLine(tmp);
394 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 395 CRRQSocket *s = new CRRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
395 ASSERT(s); 396 ASSERT(s);
396 tftpRQ->GetOptions(&s->m_Options); 397 tftpRQ->GetOptions(&s->m_Options);
397 if(!s->Create()) 398 if(!s->Create())
398 s->Destroy(FALSE); 399 s->Destroy(FALSE);
399 } 400 }
400 break; 401 break;
401 case tftp::opWRQ: 402 case tftp::opWRQ:
402 // Write Request 403 // Write Request
403 { 404 {
404 CString tmp; 405 CString tmp;
405 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));
406 m_Daddy->LogLine(tmp); 407 m_Daddy->LogLine(tmp);
407 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin); 408 CWRQSocket *s = new CWRQSocket(m_Daddy,tftpRQ->rqFileName(),tftpRQ->rqType(),&sin);
408 ASSERT(s); 409 ASSERT(s);
409 tftpRQ->GetOptions(&s->m_Options); 410 tftpRQ->GetOptions(&s->m_Options);
410 if(!s->Create(NULL,NULL)) 411 if(!s->Create(NULL,NULL))
411 s->Destroy(FALSE); 412 s->Destroy(FALSE);
412 } 413 }
413 break; 414 break;
414 default: 415 default:
415 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE); 416 m_Daddy->LogLine(IDS_LOG_LISTENOPCODE);
416 delete tftpRQ; 417 delete tftpRQ;
417 return; 418 return;
418 } 419 }
419 delete tftpRQ; 420 delete tftpRQ;
420} 421}
421 422
422BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin) 423BOOL tftp::Receive(CAsyncSocket* socket,UINT maxLength,SOCKADDR_IN *sin)
423{ 424{
424 ASSERT(socket); 425 ASSERT(socket);
425int saddrLen = sizeof(SOCKADDR_IN); 426int saddrLen = sizeof(SOCKADDR_IN);
426 length = sin ? 427 length = sin ?
427 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen) 428 socket->ReceiveFrom(udpBase(),maxLength,(SOCKADDR*)sin,&saddrLen)
428 : 429 :
429 socket->Receive(udpBase(),maxLength) 430 socket->Receive(udpBase(),maxLength)
430 ; 431 ;
431 if(!length) 432 if(!length)
432 return FALSE; 433 return FALSE;
433 if(length==(tftpLength)SOCKET_ERROR) 434 if(length==(tftpLength)SOCKET_ERROR)
434 return FALSE; 435 return FALSE;
435 return TRUE; 436 return TRUE;
436} 437}
437 438
438UINT tftp::Opcode() 439UINT tftp::Opcode()
439{ 440{
440 return REVERSEBYTES(opcode); 441 return REVERSEBYTES(opcode);
441} 442}
442 443
443CString tftp::rqFileName() 444CString tftp::rqFileName()
444{ 445{
445 ASSERT(length); 446 ASSERT(length);
446 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
447CString rv; 448CString rv;
448 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode))) 449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode)))
449 rv = (LPCTSTR)data.m_RQ.data; 450 rv = (LPCTSTR)data.m_RQ.data;
450 return rv; 451 return rv;
451} 452}
452 453
453CString tftp::rqType() 454CString tftp::rqType()
454{ 455{
455 ASSERT(length); 456 ASSERT(length);
456 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
457CString rv; 458CString rv;
458char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
459 if(tmp++) 460 if(tmp++)
460 rv = (LPCTSTR)tmp; 461 rv = (LPCTSTR)tmp;
461 return rv; 462 return rv;
462} 463}
463 464
464UINT tftp::GetOptions(tftp::tftpOptions* ops) 465UINT tftp::GetOptions(tftp::tftpOptions* ops)
465{ 466{
466 ASSERT(length); 467 ASSERT(length);
467 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK); 468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK);
468 ASSERT(ops); 469 ASSERT(ops);
469tftpOptions& o = *ops; 470tftpOptions& o = *ops;
470LPSTR base = (LPSTR)&data.m_RQ.data; 471LPSTR base = (LPSTR)&data.m_RQ.data;
471UINT basePtr = 0; 472UINT basePtr = 0;
472 if(Opcode()==opRRQ || Opcode()==opWRQ){ 473 if(Opcode()==opRRQ || Opcode()==opWRQ){
473 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
474 if(!base) 475 if(!base)
475 return 0; 476 return 0;
476 base++; 477 base++;
477 basePtr = (base-(LPSTR)&data.m_RQ.data); 478 basePtr = (base-(LPSTR)&data.m_RQ.data);
478 base = (LPSTR)memchr(base,0,length-basePtr); 479 base = (LPSTR)memchr(base,0,length-basePtr);
479 if(!base) 480 if(!base)
480 return 0; 481 return 0;
481 base++; 482 base++;
482 basePtr = (base-(LPSTR)&data.m_RQ.data); 483 basePtr = (base-(LPSTR)&data.m_RQ.data);
483 } 484 }
484 ops->RemoveAll(); 485 ops->RemoveAll();
485UINT rv = 0; 486UINT rv = 0;
486 while(basePtr<(length-sizeof(opcode))){ 487 while(basePtr<(length-sizeof(opcode))){
487 CString onam = (LPSTR)&data.m_RQ.data[basePtr]; 488 CString onam = (LPSTR)&data.m_RQ.data[basePtr];
488 basePtr+=onam.GetLength()+1; 489 basePtr+=onam.GetLength()+1;
489 CString oval = (LPSTR)&data.m_RQ.data[basePtr]; 490 CString oval = (LPSTR)&data.m_RQ.data[basePtr];
490 basePtr+=oval.GetLength()+1; 491 basePtr+=oval.GetLength()+1;
491 onam.MakeLower(); 492 onam.MakeLower();
492 o[onam]=oval; 493 o[onam]=oval;
493 rv++; 494 rv++;
494 } 495 }
495 return rv; 496 return rv;
496} 497}
497 498
498tftp::tftp() 499tftp::tftp()
499{ 500{
500 length=0; 501 length=0;
501} 502}
502 503
503 504
504void CXferSocket::OnSend(int nErrorCode) 505void CXferSocket::OnSend(int nErrorCode)
505{ 506{
506 if(nErrorCode){ 507 if(nErrorCode){
507 ASSERT(m_Daddy); 508 ASSERT(m_Daddy);
508 m_Daddy->LogLine(IDS_LOG_XFERSEND); 509 m_Daddy->LogLine(IDS_LOG_XFERSEND);
509 return; 510 return;
510 } 511 }
511 if(!m_Queue.IsEmpty()){ 512 if(!m_Queue.IsEmpty()){
512 tftp *p = m_Queue.GetHead(); 513 tftp *p = m_Queue.GetHead();
513 ASSERT(p); 514 ASSERT(p);
514 m_Queue.RemoveHead(); 515 m_Queue.RemoveHead();
515 if(!p->Send(this,&m_Peer)){ 516 if(!p->Send(this,&m_Peer)){
516 ASSERT(m_Daddy); 517 ASSERT(m_Daddy);
517 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); 518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND);
518 } 519 }
519 delete p; 520 delete p;
520 } 521 }
521 DoSelect(); 522 DoSelect();
522 if(m_Queue.IsEmpty()){ 523 if(m_Queue.IsEmpty()){
523 switch(state){ 524 switch(state){
524 case stateDeny: 525 case stateDeny:
525 Destroy(FALSE); 526 Destroy(FALSE);
526 break; 527 break;
527 case stateFinish: 528 case stateFinish:
528 Destroy(TRUE); 529 Destroy(TRUE);
529 break; 530 break;
530 } 531 }
531 } 532 }
532} 533}
533 534
534BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) 535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr)
535{ 536{
536 ASSERT(socket); 537 ASSERT(socket);
537int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); 538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN));
538 if(rv!=length) 539 if(rv!=length)
539 return FALSE; 540 return FALSE;
540 return TRUE; 541 return TRUE;
541} 542}
542 543
543void CXferSocket::DoSelect() 544void CXferSocket::DoSelect()
544{ 545{
545 if(m_Peer.sin_addr.s_addr!=INADDR_NONE) 546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE)
546 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); 547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE));
547} 548}
548 549
549void CXferSocket::OnReceive(int nErrorCode) 550void CXferSocket::OnReceive(int nErrorCode)
550{ 551{
551 if(nErrorCode){ 552 if(nErrorCode){
552 ASSERT(m_Daddy); 553 ASSERT(m_Daddy);
553 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); 554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE);
554 return; 555 return;
555 } 556 }
556 ASSERT(m_Daddy); 557 ASSERT(m_Daddy);
557DWORD fionread = 0; 558DWORD fionread = 0;
558 VERIFY(IOCtl(FIONREAD,&fionread)); 559 VERIFY(IOCtl(FIONREAD,&fionread));
559tftp *p = tftp::Allocate(fionread); 560tftp *p = tftp::Allocate(fionread);
560 ASSERT(p); 561 ASSERT(p);
561SOCKADDR_IN sin; 562SOCKADDR_IN sin;
562 if(!p->Receive(this,fionread,&sin)){ 563 if(!p->Receive(this,fionread,&sin)){
563 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); 564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE);
564 delete p; 565 delete p;
565 }else 566 }else
566 if(m_Peer.sin_addr.s_addr==INADDR_NONE){ 567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){
567 m_Peer.sin_addr=sin.sin_addr; 568 m_Peer.sin_addr=sin.sin_addr;
568 m_Peer.sin_port=sin.sin_port; 569 m_Peer.sin_port=sin.sin_port;
569 } 570 }
570BOOL alive = TRUE; 571BOOL alive = TRUE;
571 if(state==stateInit){ 572 if(state==stateInit){
572 state=stateXfer; 573 state=stateXfer;
573 m_Peer.sin_port=sin.sin_port; 574 m_Peer.sin_port=sin.sin_port;
574 UpdateList(); 575 UpdateList();
575 } 576 }
576 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){
577 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID); 578 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID);
578 // *** Bounce it! 579 // *** Bounce it!
579 }else{ 580 }else{
580 alive = OnTFTP(p); 581 alive = OnTFTP(p);
581 } 582 }
582 delete p; 583 delete p;
583 if(alive){ 584 if(alive){
584 DoSelect(); 585 DoSelect();
585 ResetTimeout(); 586 ResetTimeout();
586 } 587 }
587} 588}
588 589
589void CXferSocket::SetPeer(SOCKADDR_IN *sin) 590void CXferSocket::SetPeer(SOCKADDR_IN *sin)
590{ 591{
591 ASSERT(sin); 592 ASSERT(sin);
592 memmove(&m_Peer,sin,sizeof(m_Peer)); 593 memmove(&m_Peer,sin,sizeof(m_Peer));
593} 594}
594 595
595void CXferSocket::UpdateList() 596void CXferSocket::UpdateList()
596{ 597{
597 ASSERT(m_Daddy); 598 ASSERT(m_Daddy);
598LV_FINDINFO lvf; 599LV_FINDINFO lvf;
599 memset(&lvf,0,sizeof(lvf)); 600 memset(&lvf,0,sizeof(lvf));
600 lvf.flags=LVFI_PARAM; 601 lvf.flags=LVFI_PARAM;
601 lvf.lParam=(LPARAM)this; 602 lvf.lParam=(LPARAM)this;
602int i = m_Daddy->m_List.FindItem(&lvf); 603int i = m_Daddy->m_List.FindItem(&lvf);
603 if(i<0){ 604 if(i<0){
604 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); 605 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket)));
605 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);
606 ASSERT(!(i<0)); 607 ASSERT(!(i<0));
607 m_Daddy->m_List.SetItemData(i,(DWORD)this); 608 m_Daddy->m_List.SetItemData(i,(DWORD)this);
608 } 609 }
609 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); 610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName);
610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); 611 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type);
611 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));
612CString tmp; 613CString tmp;
613 tmp.Format(IDS_FMT_BYTES,GetACK()); 614 tmp.Format(IDS_FMT_BYTES,GetACK());
614 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); 615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp);
615 if(m_xferSize>=0){ 616 if(m_xferSize>=0){
616 tmp.Format(IDS_FMT_BYTES,m_xferSize); 617 tmp.Format(IDS_FMT_BYTES,m_xferSize);
617 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); 618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp);
618 } 619 }
619} 620}
620 621
621CXferSocket::CXferSocket() 622CXferSocket::CXferSocket()
622 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
623 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 624 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
624 m__blkSize(512), m__timeOut(30) 625 m__blkSize(512), m__timeOut(30)
625{ 626{
626 m_Daddy=NULL; 627 m_Daddy=NULL;
627 m_Peer.sin_addr.s_addr=INADDR_NONE; 628 m_Peer.sin_addr.s_addr=INADDR_NONE;
628 m_Peer.sin_family=AF_INET; 629 m_Peer.sin_family=AF_INET;
629 state=stateNone; 630 state=stateNone;
630} 631}
631 632
632ULONG CXferSocket::GetACK() 633ULONG CXferSocket::GetACK()
633{ 634{
634 return 0; 635 return 0;
635} 636}
636 637
637CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) 638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin)
638 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
639 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 640 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
640 m__blkSize(512), m__timeOut(30) 641 m__blkSize(512), m__timeOut(30)
641{ 642{
642 m_Peer.sin_family=AF_INET; 643 m_Peer.sin_family=AF_INET;
643 state=stateNone; 644 state=stateNone;
644 ASSERT(daddy); 645 ASSERT(daddy);
645 m_Daddy=daddy; 646 m_Daddy=daddy;
646 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); 647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds();
647 if(sin){ 648 if(sin){
648 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; 649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr;
649 m_Peer.sin_port=sin->sin_port; 650 m_Peer.sin_port=sin->sin_port;
650 }else 651 }else
651 m_Peer.sin_addr.s_addr=INADDR_NONE; 652 m_Peer.sin_addr.s_addr=INADDR_NONE;
652 m_FileName=fileName; 653 m_FileName=fileName;
653 m_Type=type; 654 m_Type=type;
654} 655}
655 656
656BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
657{ 658{
658 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 659 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
659 return FALSE; 660 return FALSE;
660 ASSERT(m_Daddy); 661 ASSERT(m_Daddy);
661 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
662 m_Daddy->m_Xfers[m_hSocket]=this; 663 m_Daddy->m_Xfers[m_hSocket]=this;
663CString lFile = localFile?localFile:m_FileName; 664CString lFile = localFile?localFile:m_FileName;
664 TurnSlashes(lFile,TRUE); 665 TurnSlashes(lFile,TRUE);
665 UpdateList(); 666 UpdateList();
666 if(!localFile){// Check only if server 667 if(!localFile){// Check only if server
667 if(CheckBadRelativeness(m_FileName)){ 668 if(CheckBadRelativeness(m_FileName)){
668 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
669 return TRUE; 670 return TRUE;
670 } 671 }
671 switch(m_Daddy->m_RRQMode){ 672 switch(m_Daddy->m_RRQMode){
672 case CPumpKINDlg::rrqGiveAll: 673 case CPumpKINDlg::rrqGiveAll:
673 break; 674 break;
674 case CPumpKINDlg::rrqAlwaysConfirm: 675 case CPumpKINDlg::rrqAlwaysConfirm:
675 if(ConfirmRequest()) 676 if(ConfirmRequest())
676 break; 677 break;
677 case CPumpKINDlg::rrqDenyAll: 678 case CPumpKINDlg::rrqDenyAll:
678 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
679 return TRUE; 680 return TRUE;
680 } 681 }
681 } 682 }
682CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); 683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
683CFileException e; 684CFileException e;
684 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){ 685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
685 if(localFile){ 686 if(localFile){
686 CString tmp; 687 CString tmp;
687 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn); 688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
688 m_Daddy->LogLine(tmp); 689 m_Daddy->LogLine(tmp);
689 return FALSE; 690 return FALSE;
690 } 691 }
691 Deny(&e); 692 Deny(&e);
692 return TRUE; 693 return TRUE;
693 } 694 }
694 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION 695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION
695 if(hostName){ 696 if(hostName){
696 m_HostName=hostName; 697 m_HostName=hostName;
697 698
698 CString tmp; 699 CString tmp;
699 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); 700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName);
700 m_Daddy->LogLine(tmp); 701 m_Daddy->LogLine(tmp);
701 702
702 CString inAddr = hostName; 703 CString inAddr = hostName;
703 int at = inAddr.Find('@'); 704 int at = inAddr.Find('@');
704 if(at>=0) 705 if(at>=0)
705 inAddr=inAddr.Mid(at+1); 706 inAddr=inAddr.Mid(at+1);
706 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){
707 ASSERT(!m_wndResolver); 708 ASSERT(!m_wndResolver);
708 m_wndResolver = new CResolver(this); 709 m_wndResolver = new CResolver(this);
709 ASSERT(m_wndResolver); 710 ASSERT(m_wndResolver);
710 return m_wndResolver->Resolve(); 711 return m_wndResolver->Resolve();
711 } 712 }
712 else 713 else
713 OnHostKnown(); 714 OnHostKnown();
714 }else{ 715 }else{
715 tftp::tftpOptions o; 716 tftp::tftpOptions o;
716 CString v; 717 CString v;
717 if(m_Options.Lookup(tftpoBSize,v)){ 718 if(m_Options.Lookup(tftpoBSize,v)){
718 m__blkSize=atoi(v); 719 m__blkSize=atoi(v);
719 if(m__blkSize){ 720 if(m__blkSize){
720 m_blkSize=m__blkSize; 721 m_blkSize=m__blkSize;
721 v.Format("%u",m_blkSize); 722 v.Format("%u",m_blkSize);
722 o[tftpoBSize]=v; 723 o[tftpoBSize]=v;
723 } 724 }
724 } 725 }
725 if(m_Options.Lookup(tftpoTSize,v)){ 726 if(m_Options.Lookup(tftpoTSize,v)){
726 v.Format("%lu",m_xferSize); 727 v.Format("%lu",m_xferSize);
727 o[tftpoTSize]=v; 728 o[tftpoTSize]=v;
728 } 729 }
729 if(m_Options.Lookup(tftpoTOut,v)){ 730 if(m_Options.Lookup(tftpoTOut,v)){
730 m__timeOut=atoi(v); 731 m__timeOut=atoi(v);
731 if(m__timeOut){ 732 if(m__timeOut){
732 m_timeOut=m__timeOut; 733 m_timeOut=m__timeOut;
733 v.Format("%u",m_timeOut); 734 v.Format("%u",m_timeOut);
734 o[tftpoTOut]=v; 735 o[tftpoTOut]=v;
735 } 736 }
736 } 737 }
737 state = stateXfer; 738 state = stateXfer;
738 m_ACK=0; 739 m_ACK=0;
739 if(o.GetCount()){ 740 if(o.GetCount()){
740 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o)); 741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o));
741 ASSERT(p); 742 ASSERT(p);
742 p->SetOpcode(tftp::opOACK); 743 p->SetOpcode(tftp::opOACK);
743 p->data.m_OACK.Set(&o); 744 p->data.m_OACK.Set(&o);
744 PostTFTP(p,TRUE); 745 PostTFTP(p,TRUE);
745 }else 746 }else
746 DoXfer(); 747 DoXfer();
747 } 748 }
748 return TRUE; 749 return TRUE;
749} 750}
750 751
751CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
752 : CXferSocket(daddy,fileName,type,sin) 753 : CXferSocket(daddy,fileName,type,sin)
753{ 754{
754 m_ACK=0; 755 m_ACK=0;
755 m_LastSlack=0; 756 m_LastSlack=0;
756} 757}
757 758
758UINT tftp::tftpERROR::tftpSize(LPCTSTR msg) 759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg)
759{ 760{
760 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1; 761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1;
761} 762}
762 763
763tftp* tftp::Allocate(UINT tftpSize) 764tftp* tftp::Allocate(UINT tftpSize)
764{ 765{
765 ASSERT(tftpSize); 766 ASSERT(tftpSize);
766tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize]; 767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize];
767 ASSERT(rv); 768 ASSERT(rv);
768 rv->length=tftpSize; 769 rv->length=tftpSize;
769 return rv; 770 return rv;
770} 771}
771 772
772void tftp::errSet(UINT code,LPCTSTR msg) 773void tftp::errSet(UINT code,LPCTSTR msg)
773{ 774{
774 ASSERT(this); 775 ASSERT(this);
775 ASSERT(length>=data.m_ERROR.tftpSize(msg)); 776 ASSERT(length>=data.m_ERROR.tftpSize(msg));
776 strcpy((char*)data.m_ERROR.data,msg); 777 strcpy((char*)data.m_ERROR.data,msg);
777 data.m_ERROR.SetCode(code); 778 data.m_ERROR.SetCode(code);
778} 779}
779 780
780void CXferSocket::PostTFTP(tftp* p,BOOL retryable) 781void CXferSocket::PostTFTP(tftp* p,BOOL retryable)
781{ 782{
782 ASSERT(p); 783 ASSERT(p);
783 m_Queue.AddTail(p); 784 m_Queue.AddTail(p);
784 DoSelect(); 785 DoSelect();
785 if(!m_bRetry){ 786 if(!m_bRetry){
786 if(retryable) 787 if(retryable)
787 SetTry(p); 788 SetTry(p);
788 else 789 else
789 SetTry(); 790 SetTry();
790 } 791 }
791 ResetTimeout(); 792 ResetTimeout();
792} 793}
793 794
794void CXferSocket::Deny(UINT errCode,UINT errID) 795void CXferSocket::Deny(UINT errCode,UINT errID)
795{ 796{
796 PostError(errCode,errID); 797 PostError(errCode,errID);
797 state=stateDeny; 798 state=stateDeny;
798} 799}
799 800
800void CRRQSocket::DoXfer() 801void CRRQSocket::DoXfer()
801{ 802{
802tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); 803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
803 ASSERT(p); 804 ASSERT(p);
804 p->SetOpcode(tftp::opDATA); 805 p->SetOpcode(tftp::opDATA);
805 TRY{ 806 TRY{
806 m_File.Seek(m_ACK*m_blkSize,CFile::begin); 807 m_File.Seek(m_ACK*m_blkSize,CFile::begin);
807 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);
808 p->data.m_DATA.SetBlock(m_ACK+1); 809 p->data.m_DATA.SetBlock(m_ACK+1);
809 p->length=p->length-m_blkSize+bytes; 810 p->length=p->length-m_blkSize+bytes;
810 m_LastSlack = m_blkSize-bytes; 811 m_LastSlack = m_blkSize-bytes;
811 PostTFTP(p); 812 PostTFTP(p);
812 if(bytes<m_blkSize){ 813 if(bytes<m_blkSize){
813 state=stateFinish; 814 state=stateFinish;
814 ASSERT(m_Daddy); 815 ASSERT(m_Daddy);
815 CString tmp; 816 CString tmp;
816 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName); 817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
817 m_Daddy->LogLine(tmp); 818 m_Daddy->LogLine(tmp);
818 } 819 }
819 }CATCH(CFileException,e){ 820 }CATCH(CFileException,e){
820 Deny(e); 821 Deny(e);
821 }END_CATCH 822 }END_CATCH
822} 823}
823 824
824UINT tftp::tftpDATA::tftpSize(UINT blkSize) 825UINT tftp::tftpDATA::tftpSize(UINT blkSize)
825{ 826{
826 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA) 827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
827 -sizeof(BYTE)+blkSize; 828 -sizeof(BYTE)+blkSize;
828} 829}
829 830
830void CXferSocket::Deny(CFileException* e) 831void CXferSocket::Deny(CFileException* e)
831{ 832{
832 PostError(e); 833 PostError(e);
833 state=stateDeny; 834 state=stateDeny;
834} 835}
835 836
836void CXferSocket::PostError(UINT errCode,UINT errID) 837void CXferSocket::PostError(UINT errCode,UINT errID)
837{ 838{
838CString msg; 839CString msg;
839 msg.LoadString(errID); 840 msg.LoadString(errID);
840 ASSERT(m_Daddy); 841 ASSERT(m_Daddy);
841 /*// *** 842 /*// ***
842CString tmp; 843CString tmp;
843 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg); 844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg);
844 m_Daddy->LogLine(tmp); 845 m_Daddy->LogLine(tmp);
845 */ 846 */
846tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg)); 847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg));
847err->SetOpcode(tftp::opERROR); 848err->SetOpcode(tftp::opERROR);
848 err->errSet(errCode,msg); 849 err->errSet(errCode,msg);
849 PostTFTP(err); 850 PostTFTP(err);
850} 851}
851 852
852void CXferSocket::PostError(CFileException* e) 853void CXferSocket::PostError(CFileException* e)
853{ 854{
854UINT eCode; 855UINT eCode;
855UINT eMsgID; 856UINT eMsgID;
856 switch(e->m_cause){ 857 switch(e->m_cause){
857 case CFileException::fileNotFound: 858 case CFileException::fileNotFound:
858 eCode=tftp::errNotFound; 859 eCode=tftp::errNotFound;
859 eMsgID=IDS_TFTP_ERROR_NOTFOUND; 860 eMsgID=IDS_TFTP_ERROR_NOTFOUND;
860 break; 861 break;
861 case CFileException::accessDenied: 862 case CFileException::accessDenied:
862 eCode=tftp::errAccessViolation; 863 eCode=tftp::errAccessViolation;
863 eMsgID=IDS_TFTP_ERROR_ACCESS; 864 eMsgID=IDS_TFTP_ERROR_ACCESS;
864 break; 865 break;
865 case CFileException::directoryFull: 866 case CFileException::directoryFull:
866 eCode=tftp::errDiskFull; 867 eCode=tftp::errDiskFull;
867 eMsgID=IDS_TFTP_ERROR_DIRFULL; 868 eMsgID=IDS_TFTP_ERROR_DIRFULL;
868 break; 869 break;
869 case CFileException::sharingViolation: 870 case CFileException::sharingViolation:
870 eCode=tftp::errAccessViolation; 871 eCode=tftp::errAccessViolation;
871 eMsgID=IDS_TFTP_ERROR_SHARING; 872 eMsgID=IDS_TFTP_ERROR_SHARING;
872 break; 873 break;
873 case CFileException::diskFull: 874 case CFileException::diskFull:
874 eCode=tftp::errDiskFull; 875 eCode=tftp::errDiskFull;
875 eMsgID=IDS_TFTP_ERROR_DISKFULL; 876 eMsgID=IDS_TFTP_ERROR_DISKFULL;
876 break; 877 break;
877 default: 878 default:
878 eCode=tftp::errUndefined; 879 eCode=tftp::errUndefined;
879 eMsgID=IDS_TFTP_ERROR_UNDEFINED; 880 eMsgID=IDS_TFTP_ERROR_UNDEFINED;
880 break; 881 break;
881 } 882 }
882 PostError(eCode,eMsgID); 883 PostError(eCode,eMsgID);
883} 884}
884 885
885ULONG CRRQSocket::GetACK(void) 886ULONG CRRQSocket::GetACK(void)
886{ 887{
887 return (m_ACK*m_blkSize)-m_LastSlack; 888 return (m_ACK*m_blkSize)-m_LastSlack;
888} 889}
889 890
890BOOL CRRQSocket::OnTFTP(tftp* p) 891BOOL CRRQSocket::OnTFTP(tftp* p)
891{ 892{
892BOOL rv = TRUE; 893BOOL rv = TRUE;
893 switch(p->Opcode()){ 894 switch(p->Opcode()){
894 case tftp::opOACK: 895 case tftp::opOACK:
895 m_ACK=0; 896 m_ACK=0;
896 ASSERT(state!=stateFinish); 897 ASSERT(state!=stateFinish);
897 { 898 {
898 tftp::tftpOptions o; 899 tftp::tftpOptions o;
899 if(p->GetOptions(&o)){ 900 if(p->GetOptions(&o)){
900 CString v; 901 CString v;
901 if(o.Lookup(tftpoBSize,v)){ 902 if(o.Lookup(tftpoBSize,v)){
902 m_blkSize=atoi(v); 903 m_blkSize=atoi(v);
903 if(!m_blkSize){// *** More sanity checks 904 if(!m_blkSize){// *** More sanity checks
904 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 905 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
905 rv = TRUE; 906 rv = TRUE;
906 break; 907 break;
907 } 908 }
908 } 909 }
909 if(o.Lookup(tftpoTOut,v)){ 910 if(o.Lookup(tftpoTOut,v)){
910 m_timeOut=atoi(v); 911 m_timeOut=atoi(v);
911 if(!m_timeOut){// *** More sanity checks 912 if(!m_timeOut){// *** More sanity checks
912 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 913 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
913 rv = TRUE; 914 rv = TRUE;
914 break; 915 break;
915 } 916 }
916 } 917 }
917 if(o.Lookup(tftpoXResume,v)){ 918 if(o.Lookup(tftpoXResume,v)){
918 m_ACK=atoi(v); 919 m_ACK=atoi(v);
919 } 920 }
920 } 921 }
921 UpdateList(); 922 UpdateList();
922 DoXfer(); 923 DoXfer();
923 } 924 }
924 break; 925 break;
925 case tftp::opACK: 926 case tftp::opACK:
926 m_ACK=p->data.m_ACK.Block(); 927 m_ACK=p->data.m_ACK.Block();
927 if(state!=stateFinish){ 928 if(state!=stateFinish){
928 UpdateList(); 929 UpdateList();
929 DoXfer(); 930 DoXfer();
930 } 931 }
931 break; 932 break;
932 case tftp::opERROR: 933 case tftp::opERROR:
933 { 934 {
934 ASSERT(m_Daddy); 935 ASSERT(m_Daddy);
935 CString tmp; 936 CString tmp;
936 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());
937 m_Daddy->LogLine(tmp); 938 m_Daddy->LogLine(tmp);
938 } 939 }
939 Destroy(FALSE); 940 Destroy(FALSE);
940 rv = FALSE; 941 rv = FALSE;
941 break; 942 break;
942 default: 943 default:
943 ASSERT(m_Daddy); 944 ASSERT(m_Daddy);
944 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 945 m_Daddy->LogLine(IDS_LOG_XFEROPCODE);
945 // *** Self destruct maybe?? 946 // *** Self destruct maybe??
946 break; 947 break;
947 } 948 }
948 return rv; 949 return rv;
949} 950}
950 951
951BOOL CWRQSocket::OnTFTP(tftp* p) 952BOOL CWRQSocket::OnTFTP(tftp* p)
952{ 953{
953 switch(p->Opcode()){ 954 switch(p->Opcode()){
954 case tftp::opOACK: 955 case tftp::opOACK:
955 ASSERT(state!=stateFinish); 956 ASSERT(state!=stateFinish);
956 { 957 {
957 if(m_bResume) 958 if(m_bResume)
958 m_ACK=m_File.GetLength()/m_blkSize; 959 m_ACK=m_File.GetLength()/m_blkSize;
959 else 960 else
960 m_ACK=0; 961 m_ACK=0;
961 tftp::tftpOptions o; 962 tftp::tftpOptions o;
962 if(p->GetOptions(&o)){ 963 if(p->GetOptions(&o)){
963 CString v; 964 CString v;
964 if(o.Lookup(tftpoBSize,v)){ 965 if(o.Lookup(tftpoBSize,v)){
965 m_blkSize=atoi(v); 966 m_blkSize=atoi(v);
966 if(!m_blkSize){// *** More sanity checks 967 if(!m_blkSize){// *** More sanity checks
967 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 968 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
968 return TRUE; 969 return TRUE;
969 } 970 }
970 } 971 }
971 if(o.Lookup(tftpoTOut,v)){ 972 if(o.Lookup(tftpoTOut,v)){
972 m_timeOut=atoi(v); 973 m_timeOut=atoi(v);
973 if(!m_timeOut){// *** More sanity checks 974 if(!m_timeOut){// *** More sanity checks
974 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 975 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
975 return TRUE; 976 return TRUE;
976 } 977 }
977 } 978 }
978 if(o.Lookup(tftpoTSize,v)){ 979 if(o.Lookup(tftpoTSize,v)){
979 m_xferSize=atoi(v); 980 m_xferSize=atoi(v);
980 } 981 }
981 } 982 }
982 UpdateList(); 983 UpdateList();
983 DoXfer(); 984 DoXfer();
984 } 985 }
985 break; 986 break;
986 case tftp::opDATA: 987 case tftp::opDATA:
987 { 988 {
988 UINTblock = p->data.m_DATA.Block(); 989 UINTblock = p->data.m_DATA.Block();
989 TRY{ 990 TRY{
990 m_File.Seek((block-1)*m_blkSize,CFile::begin); 991 m_File.Seek((block-1)*m_blkSize,CFile::begin);
991 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); 992 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize);
992 if(bytes){ 993 if(bytes){
993 m_File.Write(p->data.m_DATA.data,bytes); 994 m_File.Write(p->data.m_DATA.data,bytes);
994 // *** Move to the other place where we can do it not that often 995 // *** Move to the other place where we can do it not that often
995 m_File.SetLength(m_File.GetPosition()); 996 m_File.SetLength(m_File.GetPosition());
996 } 997 }
997 if(bytes<m_blkSize){ 998 if(bytes<m_blkSize){
998 state=stateFinish; 999 state=stateFinish;
999 ASSERT(m_Daddy); 1000 ASSERT(m_Daddy);
1000 CString tmp; 1001 CString tmp;
1001 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); 1002 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName);
1002 m_Daddy->LogLine(tmp); 1003 m_Daddy->LogLine(tmp);
1003 } 1004 }
1004 m_ACK=block; 1005 m_ACK=block;
1005 m_LastSlack=m_blkSize-bytes; 1006 m_LastSlack=m_blkSize-bytes;
1006 UpdateList(); 1007 UpdateList();
1007 DoXfer(); 1008 DoXfer();
1008 }CATCH(CFileException,e){ 1009 }CATCH(CFileException,e){
1009 Deny(e); 1010 Deny(e);
1010 }END_CATCH 1011 }END_CATCH
1011 } 1012 }
1012 break; 1013 break;
1013 case tftp::opERROR: 1014 case tftp::opERROR:
1014 { 1015 {
1015 ASSERT(m_Daddy); 1016 ASSERT(m_Daddy);
1016 CString tmp; 1017 CString tmp;
1017 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 1018 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
1018 m_Daddy->LogLine(tmp); 1019 m_Daddy->LogLine(tmp);
1019 } 1020 }
1020 Destroy(FALSE); 1021 Destroy(FALSE);
1021 return FALSE; 1022 return FALSE;
1022 default: 1023 default:
1023 ASSERT(m_Daddy); 1024 ASSERT(m_Daddy);
1024 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 1025 m_Daddy->LogLine(IDS_LOG_XFEROPCODE);
1025 // *** Self destruct maybe?? 1026 // *** Self destruct maybe??
1026 break; 1027 break;
1027 } 1028 }
1028 return TRUE; 1029 return TRUE;
1029} 1030}
1030 1031
1031void tftp::SetOpcode(WORD op) 1032void tftp::SetOpcode(WORD op)
1032{ 1033{
1033 opcode = REVERSEBYTES(op); 1034 opcode = REVERSEBYTES(op);
1034} 1035}
1035void tftp::tftpDATA::SetBlock(WORD b) 1036void tftp::tftpDATA::SetBlock(WORD b)
1036{ 1037{
1037 block=REVERSEBYTES(b); 1038 block=REVERSEBYTES(b);
1038} 1039}
1039WORD tftp::tftpDATA::Block() 1040WORD tftp::tftpDATA::Block()
1040{ 1041{
1041 return REVERSEBYTES(block); 1042 return REVERSEBYTES(block);
1042} 1043}
1043WORD tftp::tftpACK::Block() 1044WORD tftp::tftpACK::Block()
1044{ 1045{
1045 return REVERSEBYTES(block); 1046 return REVERSEBYTES(block);
1046} 1047}
1047void tftp::tftpACK::SetBlock(WORD b) 1048void tftp::tftpACK::SetBlock(WORD b)
1048{ 1049{
1049 block = REVERSEBYTES(b); 1050 block = REVERSEBYTES(b);
1050} 1051}
1051WORD tftp::tftpERROR::Code() 1052WORD tftp::tftpERROR::Code()
1052{ 1053{
1053 return REVERSEBYTES(code); 1054 return REVERSEBYTES(code);
1054} 1055}
1055void tftp::tftpERROR::SetCode(WORD c) 1056void tftp::tftpERROR::SetCode(WORD c)
1056{ 1057{
1057 code = REVERSEBYTES(c); 1058 code = REVERSEBYTES(c);
1058} 1059}
1059 1060
1060 1061
1061CString tftp::errMessage() 1062CString tftp::errMessage()
1062{ 1063{
1063CString rv; 1064CString rv;
1064 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) 1065 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code)))
1065 rv = (LPCTSTR)data.m_ERROR.data; 1066 rv = (LPCTSTR)data.m_ERROR.data;
1066 return rv; 1067 return rv;
1067} 1068}
1068 1069
1069void CXferSocket::Destroy(BOOL success) 1070void CXferSocket::Destroy(BOOL success)
1070{ 1071{
1071 if(m_wndResolver){ 1072 if(m_wndResolver){
1072 delete m_wndResolver; 1073 delete m_wndResolver;
1073 m_wndResolver=NULL; 1074 m_wndResolver=NULL;
1074 } 1075 }
1075 SetTry(); 1076 SetTry();
1076 m_Daddy->m_bnw.StartSound( 1077 m_Daddy->m_bnw.StartSound(
1077 success 1078 success
1078 ? m_Daddy->m_bnwSuccess 1079 ? m_Daddy->m_bnwSuccess
1079 : m_Daddy->m_bnwAbort 1080 : m_Daddy->m_bnwAbort
1080 ); 1081 );
1081 if(m_File.m_hFile!=CFile::hFileNull){ 1082 if(m_File.m_hFile!=CFile::hFileNull){
1082 TRY{ 1083 TRY{
1083 m_File.Close(); 1084 m_File.Close();
1084 }CATCH(CFileException,e){ 1085 }CATCH(CFileException,e){
1085 TRACE0("Error closing file\n"); 1086 TRACE0("Error closing file\n");
1086 }END_CATCH 1087 }END_CATCH
1087 } 1088 }
1088 ASSERT(m_Daddy); 1089 ASSERT(m_Daddy);
1089 m_Daddy->KillTimer(m_hSocket); 1090 m_Daddy->KillTimer(m_hSocket);
1090 m_Daddy->m_Xfers.RemoveKey(m_hSocket); 1091 m_Daddy->m_Xfers.RemoveKey(m_hSocket);
1091LV_FINDINFO lvf; 1092LV_FINDINFO lvf;
1092 memset(&lvf,0,sizeof(lvf)); 1093 memset(&lvf,0,sizeof(lvf));
1093 lvf.flags=LVFI_PARAM; 1094 lvf.flags=LVFI_PARAM;
1094 lvf.lParam=(LPARAM)this; 1095 lvf.lParam=(LPARAM)this;
1095int i = m_Daddy->m_List.FindItem(&lvf); 1096int i = m_Daddy->m_List.FindItem(&lvf);
1096 if(i>=0) 1097 if(i>=0)
1097 m_Daddy->m_List.DeleteItem(i); 1098 m_Daddy->m_List.DeleteItem(i);
1098 delete this; 1099 delete this;
1099} 1100}
1100 1101
1101void CPumpKINDlg::LogLine(LPCTSTR str) 1102void CPumpKINDlg::LogLine(LPCTSTR str)
1102{ 1103{
1103 ASSERT(m_LogLength); 1104 ASSERT(m_LogLength);
1104 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ 1105 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
1105 CTime *t = (CTime*)m_Log.GetItemData(0); 1106 CTime *t = (CTime*)m_Log.GetItemData(0);
1106 if(((DWORD)t)!=LB_ERR){ 1107 if(((DWORD)t)!=LB_ERR){
1107 ASSERT(t); 1108 ASSERT(t);
1108 m_LogTimes.RemoveKey(t); 1109 m_LogTimes.RemoveKey(t);
1109 delete t; 1110 delete t;
1110 } 1111 }
1111 m_Log.DeleteString(0); 1112 m_Log.DeleteString(0);
1112 } 1113 }
1113int i = m_Log.AddString(str); 1114int i = m_Log.AddString(str);
1114 ASSERT(i!=LB_ERR); 1115 ASSERT(i!=LB_ERR);
1115CTime *t = new CTime(CTime::GetCurrentTime()); 1116CTime *t = new CTime(CTime::GetCurrentTime());
1116 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); 1117 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t));
1117 m_Log.SetCurSel(i); 1118 m_Log.SetCurSel(i);
1118} 1119}
1119 1120
1120void CPumpKINDlg::LogLine(UINT msgID) 1121void CPumpKINDlg::LogLine(UINT msgID)
1121{ 1122{
1122CString tmp; 1123CString tmp;
1123 tmp.Format(msgID); 1124 tmp.Format(msgID);
1124 LogLine(tmp); 1125 LogLine(tmp);
1125} 1126}
1126 1127
1127void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) 1128void CXferSocket::TurnSlashes(CString& fn,BOOL bBack)
1128{ 1129{
1129 ints = fn.Find(bBack?'/':'\\'); 1130 ints = fn.Find(bBack?'/':'\\');
1130 while(s>=0){ 1131 while(s>=0){
1131 fn.SetAt(s,bBack?'\\':'/'); 1132 fn.SetAt(s,bBack?'\\':'/');
1132 s = fn.Find(bBack?'/':'\\'); 1133 s = fn.Find(bBack?'/':'\\');
1133 } 1134 }
1134} 1135}
1135 1136
1136CString CXferSocket::ApplyRoot(LPCTSTR fileName) 1137CString CXferSocket::ApplyRoot(LPCTSTR fileName)
1137{ 1138{
1138 ASSERT(m_Daddy); 1139 ASSERT(m_Daddy);
1139CString fn = fileName; 1140CString fn = fileName;
1140CString rv = m_Daddy->m_TFTPRoot; 1141CString rv = m_Daddy->m_TFTPRoot;
1141 if(rv.IsEmpty()) 1142 if(rv.IsEmpty())
1142 rv = "."; 1143 rv = ".";
1143 if(rv[rv.GetLength()-1]!='\\') 1144 if(rv[rv.GetLength()-1]!='\\')
1144 rv+="\\"; 1145 rv+="\\";
1145 while((!fn.IsEmpty()) && fn[0]=='\\') 1146 while((!fn.IsEmpty()) && fn[0]=='\\')
1146 fn=fn.Mid(1); 1147 fn=fn.Mid(1);
1147 rv+=fn; 1148 rv+=fn;
1148 return rv; 1149 return rv;
1149} 1150}
1150 1151
1151void CPumpKINDlg::OnOptions() 1152void CPumpKINDlg::OnOptions()
1152{ 1153{
1153CPropertySheet cps(IDS_TITLE_OPTIONS,this); 1154CPropertySheet cps(IDS_TITLE_OPTIONS,this);
1154CPropsServer server; 1155CPropsServer server;
1155CPropsNetwork network; 1156CPropsNetwork network;
1156CPropsSounds sounds; 1157CPropsSounds sounds;
1157 1158
1158 server.m_RRQMode=m_RRQMode; 1159 server.m_RRQMode=m_RRQMode;
1159 server.m_TFTPRoot=m_TFTPRoot; 1160 server.m_TFTPRoot=m_TFTPRoot;
1160 server.m_TFTPSubdirs=m_bTFTPSubdirs; 1161 server.m_TFTPSubdirs=m_bTFTPSubdirs;
1161 server.m_WRQMode=m_WRQMode; 1162 server.m_WRQMode=m_WRQMode;
1162 server.m_PromptTimeOut=m_PromptTimeOut; 1163 server.m_PromptTimeOut=m_PromptTimeOut;
1163 1164
1164 network.m_ListenPort=m_ListenPort; 1165 network.m_ListenPort=m_ListenPort;
1165 network.m_SpeakPort=m_SpeakPort; 1166 network.m_SpeakPort=m_SpeakPort;
1166 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds(); 1167 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
1167 network.m_BlockSize=m_BlockSize; 1168 network.m_BlockSize=m_BlockSize;
1168 1169
1169 sounds.m_Request = m_bnwRequest; 1170 sounds.m_Request = m_bnwRequest;
1170 sounds.m_Success = m_bnwSuccess; 1171 sounds.m_Success = m_bnwSuccess;
1171 sounds.m_Abort = m_bnwAbort; 1172 sounds.m_Abort = m_bnwAbort;
1172 1173
1173 cps.AddPage(&server); 1174 cps.AddPage(&server);
1174 cps.AddPage(&network); 1175 cps.AddPage(&network);
1175 cps.AddPage(&sounds); 1176 cps.AddPage(&sounds);
1176 if(cps.DoModal()==IDOK){ 1177 if(cps.DoModal()==IDOK){
1177 m_RRQMode=server.m_RRQMode; 1178 m_RRQMode=server.m_RRQMode;
1178 m_TFTPRoot=server.m_TFTPRoot; 1179 m_TFTPRoot=server.m_TFTPRoot;
1179 m_bTFTPSubdirs=server.m_TFTPSubdirs; 1180 m_bTFTPSubdirs=server.m_TFTPSubdirs;
1180 m_WRQMode=server.m_WRQMode; 1181 m_WRQMode=server.m_WRQMode;
1181 m_PromptTimeOut=server.m_PromptTimeOut; 1182 m_PromptTimeOut=server.m_PromptTimeOut;
1182 1183
1183 m_ListenPort=network.m_ListenPort; 1184 m_ListenPort=network.m_ListenPort;
1184 m_SpeakPort=network.m_SpeakPort; 1185 m_SpeakPort=network.m_SpeakPort;
1185 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut); 1186 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
1186 m_BlockSize=network.m_BlockSize; 1187 m_BlockSize=network.m_BlockSize;
1187 1188
1188 m_bnwRequest = sounds.m_Request; 1189 m_bnwRequest = sounds.m_Request;
1189 m_bnwSuccess = sounds.m_Success; 1190 m_bnwSuccess = sounds.m_Success;
1190 m_bnwAbort = sounds.m_Abort; 1191 m_bnwAbort = sounds.m_Abort;
1191 } 1192 }
1192} 1193}
1193 1194
1194BOOL CRRQSocket::ConfirmRequest() 1195BOOL CRRQSocket::ConfirmRequest()
1195{ 1196{
1196CConfirmRRQDlg cd(NULL); 1197CConfirmRRQDlg cd(NULL);
1197 cd.m_Daddy=this; 1198 cd.m_Daddy=this;
1198 cd.m_File=m_FileName; 1199 cd.m_File=m_FileName;
1199 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1200 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1200 if(cd.DoModal()==IDOK) 1201 if(cd.DoModal()==IDOK)
1201 return TRUE; 1202 return TRUE;
1202 return FALSE; 1203 return FALSE;
1203} 1204}
1204 1205
1205CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 1206CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
1206 : CXferSocket(daddy,fileName,type,sin) 1207 : CXferSocket(daddy,fileName,type,sin)
1207{ 1208{
1208 state=stateNone; 1209 state=stateNone;
1209 m_ACK=0; 1210 m_ACK=0;
1210 m_LastSlack=0; 1211 m_LastSlack=0;
1211 m_bResume=FALSE; 1212 m_bResume=FALSE;
1212} 1213}
1213 1214
1214BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 1215BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
1215{ 1216{
1216 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 1217 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
1217 return FALSE; 1218 return FALSE;
1218 ASSERT(m_Daddy); 1219 ASSERT(m_Daddy);
1219 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 1220 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
1220 m_Daddy->m_Xfers[m_hSocket]=this; 1221 m_Daddy->m_Xfers[m_hSocket]=this;
1221 UpdateList(); 1222 UpdateList();
1222CString lf; 1223CString lf;
1223 if(!localFile) { 1224 if(!localFile) {
1224 lf = m_FileName; 1225 lf = m_FileName;
1225 TurnSlashes(lf,TRUE); 1226 TurnSlashes(lf,TRUE);
1226 } 1227 }
1227CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); 1228CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
1228 if(!localFile){// This is an incoming request.. 1229 if(!localFile){// This is an incoming request..
1229 if(CheckBadRelativeness(m_FileName)){ 1230 if(CheckBadRelativeness(m_FileName)){
1230 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1231 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1231 return TRUE; 1232 return TRUE;
1232 } 1233 }
1233 BOOL exists; 1234 BOOL exists;
1234 if(!_access((LPCTSTR)fn,0)) 1235 if(!_access((LPCTSTR)fn,0))
1235 m_Rename=exists=TRUE; 1236 m_Rename=exists=TRUE;
1236 else 1237 else
1237 m_Rename=exists=FALSE; 1238 m_Rename=exists=FALSE;
1238 // *** m_WRQMode only if server transfer 1239 // *** m_WRQMode only if server transfer
1239 switch(m_Daddy->m_WRQMode){ 1240 switch(m_Daddy->m_WRQMode){
1240 case CPumpKINDlg::wrqTakeAll: 1241 case CPumpKINDlg::wrqTakeAll:
1241 if(exists){ 1242 if(exists){
1242 if(!RenameFile(fn)){ 1243 if(!RenameFile(fn)){
1243 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME); 1244 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
1244 return TRUE; 1245 return TRUE;
1245 } 1246 }
1246 } 1247 }
1247 break; 1248 break;
1248 case CPumpKINDlg::wrqConfirmIfExists: 1249 case CPumpKINDlg::wrqConfirmIfExists:
1249 if(!exists) 1250 if(!exists)
1250 break; 1251 break;
1251 case CPumpKINDlg::wrqAlwaysConfirm: 1252 case CPumpKINDlg::wrqAlwaysConfirm:
1252 if(exists) 1253 if(exists)
1253 m_bResume=TRUE; 1254 m_bResume=TRUE;
1254 if(ConfirmRequest()){ 1255 if(ConfirmRequest()){
1255 if(m_Rename){ 1256 if(m_Rename){
1256 RenameFile(fn); 1257 RenameFile(fn);
1257 if(SaveAs(fn)) 1258 if(SaveAs(fn))
1258 break; 1259 break;
1259 }else 1260 }else
1260 break; 1261 break;
1261 } 1262 }
1262 case CPumpKINDlg::wrqDenyAll: 1263 case CPumpKINDlg::wrqDenyAll:
1263 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1264 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1264 return TRUE; 1265 return TRUE;
1265 } 1266 }
1266 } 1267 }
1267CFileException e; 1268CFileException e;
1268 if(!m_File.Open( 1269 if(!m_File.Open(
1269 fn, 1270 fn,
1270 m_bResume 1271 m_bResume
1271 ?(CFile::modeWrite|CFile::shareDenyWrite) 1272 ?(CFile::modeWrite|CFile::shareDenyWrite)
1272 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite), 1273 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
1273 &e 1274 &e
1274 )){ 1275 )){
1275 if(localFile){// Outgoing request 1276 if(localFile){// Outgoing request
1276 CString tmp; 1277 CString tmp;
1277 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); 1278 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn);
1278 m_Daddy->LogLine(tmp); 1279 m_Daddy->LogLine(tmp);
1279 return FALSE; 1280 return FALSE;
1280 }else{ 1281 }else{
1281 Deny(&e); 1282 Deny(&e);
1282 return TRUE; 1283 return TRUE;
1283 } 1284 }
1284 } 1285 }
1285 if(hostName){ 1286 if(hostName){
1286 m_HostName=hostName; 1287 m_HostName=hostName;
1287 1288
1288 CString tmp; 1289 CString tmp;
1289 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); 1290 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName);
1290 m_Daddy->LogLine(tmp); 1291 m_Daddy->LogLine(tmp);
1291 1292
1292 CString inAddr = hostName; 1293 CString inAddr = hostName;
1293 int at = inAddr.Find('@'); 1294 int at = inAddr.Find('@');
1294 if(at>=0) 1295 if(at>=0)
1295 inAddr=inAddr.Mid(at+1); 1296 inAddr=inAddr.Mid(at+1);
1296 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 1297 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
1297 ASSERT(!m_wndResolver); 1298 ASSERT(!m_wndResolver);
1298 m_wndResolver = new CResolver(this); 1299 m_wndResolver = new CResolver(this);
1299 ASSERT(m_wndResolver); 1300 ASSERT(m_wndResolver);
1300 return m_wndResolver->Resolve(); 1301 return m_wndResolver->Resolve();
1301 }else{ 1302 }else{
1302 OnHostKnown(); 1303 OnHostKnown();
1303 return TRUE; 1304 return TRUE;
1304 } 1305 }
1305 } 1306 }
1306CString v; 1307CString v;
1307tftp::tftpOptions oack; 1308tftp::tftpOptions oack;
1308 if(m_Options.Lookup(tftpoTSize,v)){ 1309 if(m_Options.Lookup(tftpoTSize,v)){
1309 m_xferSize=atol(v); 1310 m_xferSize=atol(v);
1310 if(!m_xferSize){ 1311 if(!m_xferSize){
1311 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); 1312 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE);
1312 return TRUE; 1313 return TRUE;
1313 } 1314 }
1314 } 1315 }
1315 if(m_Options.Lookup(tftpoBSize,v)){ 1316 if(m_Options.Lookup(tftpoBSize,v)){
1316 m_blkSize=atoi(v); 1317 m_blkSize=atoi(v);
1317 if(!m_blkSize){// *** Do more about sanity check 1318 if(!m_blkSize){// *** Do more about sanity check
1318 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 1319 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
1319 return TRUE; 1320 return TRUE;
1320 } 1321 }
1321 v.Format("%u",m_blkSize); 1322 v.Format("%u",m_blkSize);
1322 oack[tftpoBSize]=v; 1323 oack[tftpoBSize]=v;
1323 } 1324 }
1324 if(m_Options.Lookup(tftpoTOut,v)){ 1325 if(m_Options.Lookup(tftpoTOut,v)){
1325 m_timeOut=atoi(v); 1326 m_timeOut=atoi(v);
1326 if(!m_timeOut){// *** Do more about sanity check 1327 if(!m_timeOut){// *** Do more about sanity check
1327 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 1328 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
1328 return TRUE; 1329 return TRUE;
1329 } 1330 }
1330 v.Format("%u",m_timeOut); 1331 v.Format("%u",m_timeOut);
1331 oack[tftpoTOut]=v; 1332 oack[tftpoTOut]=v;
1332 } 1333 }
1333 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ 1334 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){
1334 m_ACK=m_File.GetLength()/m_blkSize; 1335 m_ACK=m_File.GetLength()/m_blkSize;
1335 v.Format("%u",m_ACK); 1336 v.Format("%u",m_ACK);
1336 oack[tftpoXResume]=v; 1337 oack[tftpoXResume]=v;
1337 }else 1338 }else
1338 m_ACK=0; 1339 m_ACK=0;
1339 state=stateXfer; 1340 state=stateXfer;
1340 if(oack.GetCount()){ 1341 if(oack.GetCount()){
1341 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); 1342 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack));
1342 ASSERT(p); 1343 ASSERT(p);
1343 p->SetOpcode(tftp::opOACK); 1344 p->SetOpcode(tftp::opOACK);
1344 p->data.m_OACK.Set(&oack); 1345 p->data.m_OACK.Set(&oack);
1345 PostTFTP(p,TRUE); 1346 PostTFTP(p,TRUE);
1346 }else 1347 }else
1347 DoXfer(); 1348 DoXfer();
1348 return TRUE; 1349 return TRUE;
1349} 1350}
1350 1351
1351BOOL CWRQSocket::ConfirmRequest() 1352BOOL CWRQSocket::ConfirmRequest()
1352{ 1353{
1353CConfirmWRQDlg cd(NULL); 1354CConfirmWRQDlg cd(NULL);
1354 cd.m_Daddy=this; 1355 cd.m_Daddy=this;
1355 cd.m_File=m_FileName; 1356 cd.m_File=m_FileName;
1356 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1357 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1357 switch(cd.DoModal()){ 1358 switch(cd.DoModal()){
1358 case IDOK: 1359 case IDOK:
1359 m_Rename=FALSE; 1360 m_Rename=FALSE;
1360 m_bResume=FALSE; 1361 m_bResume=FALSE;
1361 return TRUE; 1362 return TRUE;
1362 case IDC_RENAME: 1363 case IDC_RENAME:
1363 m_bResume=FALSE; 1364 m_bResume=FALSE;
1364 m_Rename=TRUE; 1365 m_Rename=TRUE;
1365 return TRUE; 1366 return TRUE;
1366 case IDC_RESUME: 1367 case IDC_RESUME:
1367 m_Rename=FALSE; 1368 m_Rename=FALSE;
1368 m_bResume=TRUE; 1369 m_bResume=TRUE;
1369 return TRUE; 1370 return TRUE;
1370 case IDCANCEL: 1371 case IDCANCEL:
1371 return FALSE; 1372 return FALSE;
1372 } 1373 }
1373 return FALSE; 1374 return FALSE;
1374} 1375}
1375 1376
1376BOOL CWRQSocket::RenameFile(CString& fn) 1377BOOL CWRQSocket::RenameFile(CString& fn)
1377{ 1378{
1378CString renamed = fn; 1379CString renamed = fn;
1379 if(fn.IsEmpty()) 1380 if(fn.IsEmpty())
1380 return FALSE; 1381 return FALSE;
1381 if(fn[fn.GetLength()-1]==')'){ 1382 if(fn[fn.GetLength()-1]==')'){
1382 int op = fn.ReverseFind('('); 1383 int op = fn.ReverseFind('(');
1383 if(op>0 && fn[op-1]==' '){ 1384 if(op>0 && fn[op-1]==' '){
1384 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) 1385 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty())
1385 renamed = renamed.Left(op-1); 1386 renamed = renamed.Left(op-1);
1386 } 1387 }
1387 } 1388 }
1388CString testFN; 1389CString testFN;
1389 for(UINT tmp=0;tmp<32768;tmp++){ 1390 for(UINT tmp=0;tmp<32768;tmp++){
1390 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp); 1391 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp);
1391 if(!_access((LPCTSTR)testFN,0)) 1392 if(!_access((LPCTSTR)testFN,0))
1392 continue; 1393 continue;
1393 fn=testFN; 1394 fn=testFN;
1394 return TRUE; 1395 return TRUE;
1395 } 1396 }
1396 return FALSE; 1397 return FALSE;
1397} 1398}
1398 1399
1399BOOL CWRQSocket::SaveAs(CString& fn) 1400BOOL CWRQSocket::SaveAs(CString& fn)
1400{ 1401{
1401CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy); 1402CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy);
1402CString title; 1403CString title;
1403 title.LoadString(IDS_RENAME_TITLE); 1404 title.LoadString(IDS_RENAME_TITLE);
1404 cfd.m_ofn.lpstrTitle=(LPCTSTR)title; 1405 cfd.m_ofn.lpstrTitle=(LPCTSTR)title;
1405 if(cfd.DoModal()!=IDOK) 1406 if(cfd.DoModal()!=IDOK)
1406 return FALSE; 1407 return FALSE;
1407 fn = cfd.GetPathName(); 1408 fn = cfd.GetPathName();
1408 return TRUE; 1409 return TRUE;
1409} 1410}
1410 1411
1411void CWRQSocket::DoXfer() 1412void CWRQSocket::DoXfer()
1412{ 1413{
1413tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize()); 1414tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize());
1414 ASSERT(p); 1415 ASSERT(p);
1415 p->SetOpcode(tftp::opACK); 1416 p->SetOpcode(tftp::opACK);
1416 p->data.m_ACK.SetBlock(m_ACK); 1417 p->data.m_ACK.SetBlock(m_ACK);
1417 TRACE1("WRQ-ACK-%u\n",m_ACK); 1418 TRACE1("WRQ-ACK-%u\n",m_ACK);
1418 PostTFTP(p,TRUE);// *** ??? Hope this is right 1419 PostTFTP(p,TRUE);// *** ??? Hope this is right
1419} 1420}
1420 1421
1421UINT tftp::tftpACK::tftpSize() 1422UINT tftp::tftpACK::tftpSize()
1422{ 1423{
1423 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK); 1424 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK);
1424} 1425}
1425 1426
1426ULONG CWRQSocket::GetACK() 1427ULONG CWRQSocket::GetACK()
1427{ 1428{
1428 return (m_ACK*m_blkSize)-m_LastSlack; 1429 return (m_ACK*m_blkSize)-m_LastSlack;
1429} 1430}
1430 1431
1431void CXferSocket::ResetTimeout() 1432void CXferSocket::ResetTimeout()
1432{ 1433{
1433 ASSERT(m_Daddy); 1434 ASSERT(m_Daddy);
1434 m_Daddy->m_Retrier->KillTimer(m_hSocket); 1435 m_Daddy->m_Retrier->KillTimer(m_hSocket);
1435 if(m_Retry) 1436 if(m_Retry)
1436 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL); 1437 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL);
1437 if(!m_bRetry){ 1438 if(!m_bRetry){
1438 m_Daddy->KillTimer(m_hSocket); 1439 m_Daddy->KillTimer(m_hSocket);
1439 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL); 1440 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL);
1440 } 1441 }
1441} 1442}
1442 1443
1443void CXferSocket::Abort() 1444void CXferSocket::Abort()
1444{ 1445{
1445 ASSERT(m_Daddy); 1446 ASSERT(m_Daddy);
1446CString tmp; 1447CString tmp;
1447 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName); 1448 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName);
1448 m_Daddy->LogLine(tmp); 1449 m_Daddy->LogLine(tmp);
1449 Destroy(FALSE); 1450 Destroy(FALSE);
1450} 1451}
1451 1452
1452void CPumpKINDlg::OnTimer(UINT nIDEvent) 1453void CPumpKINDlg::OnTimer(UINT nIDEvent)
1453{ 1454{
1454CXferSocket *socket; 1455CXferSocket *socket;
1455 if(m_Xfers.Lookup(nIDEvent,socket)){ 1456 if(m_Xfers.Lookup(nIDEvent,socket)){
1456 CString tmp; 1457 CString tmp;
1457 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName); 1458 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName);
1458 LogLine(tmp); 1459 LogLine(tmp);
1459 socket->Abort(); 1460 socket->Abort();
1460 }else{ 1461 }else{
1461 TRACE0("Failed to find timed out socket!\n"); 1462 TRACE0("Failed to find timed out socket!\n");
1462 } 1463 }
1463 CDialog::OnTimer(nIDEvent); 1464 CDialog::OnTimer(nIDEvent);
1464} 1465}
1465 1466
1466void CPumpKINDlg::OnExit() 1467void CPumpKINDlg::OnExit()
1467{ 1468{
1468 if(!m_Xfers.IsEmpty()){ 1469 if(!m_Xfers.IsEmpty()){
1469 CString title,text; 1470 CString title,text;
1470 title.LoadString(IDS_CONFIRMEXIT_TITLE); 1471 title.LoadString(IDS_CONFIRMEXIT_TITLE);
1471 text.LoadString(IDS_CONFIRMEXIT_TEXT); 1472 text.LoadString(IDS_CONFIRMEXIT_TEXT);
1472 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES) 1473 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES)
1473 return; 1474 return;
1474 } 1475 }
1475 m_bExiting=TRUE; 1476 m_bExiting=TRUE;
1476 EndDialog(IDOK); 1477 EndDialog(IDOK);
1477} 1478}
1478 1479
1479void CPumpKINDlg::OnPut() 1480void CPumpKINDlg::OnPut()
1480{ 1481{
1481CRequestDlg crd(NULL); 1482CRequestDlg crd(NULL);
1482 crd.m_Put=TRUE; 1483 crd.m_Put=TRUE;
1483 crd.m_BSize=m_BlockSize; 1484 crd.m_BSize=m_BlockSize;
1484 if(crd.DoModal()==IDOK){ 1485 if(crd.DoModal()==IDOK){
1485 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1486 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1486 if(crd.m_BSize) 1487 if(crd.m_BSize)
1487 socket->m__blkSize=crd.m_BSize; 1488 socket->m__blkSize=crd.m_BSize;
1488 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1489 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1489 socket->Destroy(); 1490 socket->Destroy();
1490 } 1491 }
1491} 1492}
1492 1493
1493void CPumpKINDlg::OnGet() 1494void CPumpKINDlg::OnGet()
1494{ 1495{
1495CRequestDlg crd(NULL); 1496CRequestDlg crd(NULL);
1496 crd.m_Put=FALSE; 1497 crd.m_Put=FALSE;
1497 crd.m_BSize=m_BlockSize; 1498 crd.m_BSize=m_BlockSize;
1498 if(crd.DoModal()==IDOK){ 1499 if(crd.DoModal()==IDOK){
1499 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1500 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1500 if(crd.m_BSize) 1501 if(crd.m_BSize)
1501 socket->m__blkSize=crd.m_BSize; 1502 socket->m__blkSize=crd.m_BSize;
1502 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1503 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1503 socket->Destroy(); 1504 socket->Destroy();
1504 } 1505 }
1505} 1506}
1506 1507
1507void CPumpKINDlg::SetupButtons() 1508void CPumpKINDlg::SetupButtons()
1508{ 1509{
1509 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0); 1510 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0);
1510} 1511}
1511 1512
1512void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult) 1513void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult)
1513{ 1514{
1514 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1515 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1515 SetupButtons(); 1516 SetupButtons();
1516 *pResult = 0; 1517 *pResult = 0;
1517} 1518}
1518 1519
1519void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1520void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1520{ 1521{
1521 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1522 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1522 SetupButtons(); 1523 SetupButtons();
1523 *pResult = 0; 1524 *pResult = 0;
1524} 1525}
1525 1526
1526void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1527void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1527{ 1528{
1528 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1529 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1529 SetupButtons(); 1530 SetupButtons();
1530 *pResult = 0; 1531 *pResult = 0;
1531} 1532}
1532 1533
1533void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult) 1534void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult)
1534{ 1535{
1535 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1536 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1536 SetupButtons(); 1537 SetupButtons();
1537 *pResult = 0; 1538 *pResult = 0;
1538} 1539}
1539 1540
1540void CPumpKINDlg::OnAbort() 1541void CPumpKINDlg::OnAbort()
1541{ 1542{
1542 if(!m_List.GetSelectedCount()) 1543 if(!m_List.GetSelectedCount())
1543 return; 1544 return;
1544 intitems = m_List.GetItemCount(); 1545 intitems = m_List.GetItemCount();
1545 for(int tmp=0;tmp<items;tmp++){ 1546 for(int tmp=0;tmp<items;tmp++){
1546 if(!(m_List.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED)) 1547 if(!(m_List.GetItemState(tmp,LVIS_SELECTED)&LVIS_SELECTED))
1547 continue; 1548 continue;
1548 CXferSocket *xfer = (CXferSocket*) m_List.GetItemData(tmp); 1549 CXferSocket *xfer = (CXferSocket*) m_List.GetItemData(tmp);
1549 ASSERT(xfer); 1550 ASSERT(xfer);
1550 xfer->Abort(); 1551 xfer->Abort();
1551 } 1552 }
1552} 1553}
1553 1554
1554void CXferSocket::OnFailedToResolve() 1555void CXferSocket::OnFailedToResolve()
1555{ 1556{
1556 TRACE0("Resolve failed\n"); 1557 TRACE0("Resolve failed\n");
1557 delete m_wndResolver; 1558 delete m_wndResolver;
1558 m_wndResolver=NULL; 1559 m_wndResolver=NULL;
1559 ASSERT(m_Daddy); 1560 ASSERT(m_Daddy);
1560CString tmp; 1561CString tmp;
1561 tmp.Format(IDS_LOG_RESOLVEFAILED,m_HostName); 1562 tmp.Format(IDS_LOG_RESOLVEFAILED,m_HostName);
1562 m_Daddy->LogLine(tmp); 1563 m_Daddy->LogLine(tmp);
1563 Abort(); 1564 Abort();
1564} 1565}
1565 1566
1566void CXferSocket::OnResolved() 1567void CXferSocket::OnResolved()
1567{ 1568{
1568 delete m_wndResolver; 1569 delete m_wndResolver;
1569 m_wndResolver=NULL; 1570 m_wndResolver=NULL;
1570 TRACE0("Resolved\n"); 1571 TRACE0("Resolved\n");
1571 m_Peer.sin_addr.s_addr = *(DWORD*)(((hostent*)m_ResolveBuff)->h_addr); 1572 m_Peer.sin_addr.s_addr = *(DWORD*)(((hostent*)m_ResolveBuff)->h_addr);
1572} 1573}
1573 1574
1574void CRRQSocket::OnResolved() 1575void CRRQSocket::OnResolved()
1575{ 1576{
1576 CXferSocket::OnResolved(); 1577 CXferSocket::OnResolved();
1577 OnHostKnown(); 1578 OnHostKnown();
1578} 1579}
1579 1580
1580void CRRQSocket::OnHostKnown() 1581void CRRQSocket::OnHostKnown()
1581{ 1582{
1582 ASSERT(m_Daddy); 1583 ASSERT(m_Daddy);
1583 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort); 1584 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort);
1584tftp::tftpOptions o; 1585tftp::tftpOptions o;
1585CString v; 1586CString v;
1586 ASSERT(m_xferSize>=0); 1587 ASSERT(m_xferSize>=0);
1587 v.Format("%lu",m_xferSize); 1588 v.Format("%lu",m_xferSize);
1588 o[tftpoTSize] = v; 1589 o[tftpoTSize] = v;
1589 ASSERT(m__blkSize); 1590 ASSERT(m__blkSize);
1590 v.Format("%u",m__blkSize); 1591 v.Format("%u",m__blkSize);
1591 o[tftpoBSize] = v; 1592 o[tftpoBSize] = v;
1592 ASSERT(m__timeOut); 1593 ASSERT(m__timeOut);
1593 v.Format("%u",m__timeOut); 1594 v.Format("%u",m__timeOut);
1594 o[tftpoTOut] = v; 1595 o[tftpoTOut] = v;
1595 o[tftpoXResume] = "0"; 1596 o[tftpoXResume] = "0";
1596 tftp*p = tftp::Allocate(tftp::tftpWRQ::tftpSize(m_FileName,m_Type,&o)); 1597 tftp*p = tftp::Allocate(tftp::tftpWRQ::tftpSize(m_FileName,m_Type,&o));
1597 ASSERT(p); 1598 ASSERT(p);
1598 p->SetOpcode(tftp::opWRQ); 1599 p->SetOpcode(tftp::opWRQ);
1599 p->data.m_WRQ.Set(m_FileName,m_Type,&o); 1600 p->data.m_WRQ.Set(m_FileName,m_Type,&o);
1600 PostTFTP(p,TRUE); 1601 PostTFTP(p,TRUE);
1601 state=stateInit; 1602 state=stateInit;
1602 UpdateList(); 1603 UpdateList();
1603} 1604}
1604 1605
1605UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1606UINT tftp::tftpRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1606{ 1607{
1607UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1; 1608UINT rv = tftpHdrSize-tftpSlackSize+strlen(file)+1+strlen(type)+1;
1608 if(ops){ 1609 if(ops){
1609 tftpOptions& o = *ops; 1610 tftpOptions& o = *ops;
1610 POSITION p = o.GetStartPosition(); 1611 POSITION p = o.GetStartPosition();
1611 while(p){ 1612 while(p){
1612 CString n,v; 1613 CString n,v;
1613 o.GetNextAssoc(p,n,v); 1614 o.GetNextAssoc(p,n,v);
1614 rv+=n.GetLength()+1+v.GetLength()+1; 1615 rv+=n.GetLength()+1+v.GetLength()+1;
1615 } 1616 }
1616 } 1617 }
1617 return rv; 1618 return rv;
1618} 1619}
1619UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1620UINT tftp::tftpRRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1620{ 1621{
1621 return tftp::tftpRQ::tftpSize(file,type,ops); 1622 return tftp::tftpRQ::tftpSize(file,type,ops);
1622} 1623}
1623UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1624UINT tftp::tftpWRQ::tftpSize(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1624{ 1625{
1625 return tftp::tftpRQ::tftpSize(file,type,ops); 1626 return tftp::tftpRQ::tftpSize(file,type,ops);
1626} 1627}
1627UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops) 1628UINT tftp::tftpOACK::tftpSize(tftp::tftpOptions* ops)
1628{ 1629{
1629UINT rv = tftpHdrSize-tftpSlackSize; 1630UINT rv = tftpHdrSize-tftpSlackSize;
1630 if(ops){ 1631 if(ops){
1631 tftpOptions& o = *ops; 1632 tftpOptions& o = *ops;
1632 POSITION p = o.GetStartPosition(); 1633 POSITION p = o.GetStartPosition();
1633 while(p){ 1634 while(p){
1634 CString n,v; 1635 CString n,v;
1635 o.GetNextAssoc(p,n,v); 1636 o.GetNextAssoc(p,n,v);
1636 rv+=n.GetLength()+1+v.GetLength()+1; 1637 rv+=n.GetLength()+1+v.GetLength()+1;
1637 } 1638 }
1638 } 1639 }
1639 return rv; 1640 return rv;
1640} 1641}
1641void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1642void tftp::tftpRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1642{ 1643{
1643 // MAY BE DANGEROUS! 1644 // MAY BE DANGEROUS!
1644UINT ptr = 0; 1645UINT ptr = 0;
1645 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1646 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1646 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1647 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1647 if(ops){ 1648 if(ops){
1648 tftpOptions& o = *ops; 1649 tftpOptions& o = *ops;
1649 POSITION p = o.GetStartPosition(); 1650 POSITION p = o.GetStartPosition();
1650 while(p){ 1651 while(p){
1651 CString n,v; 1652 CString n,v;
1652 o.GetNextAssoc(p,n,v); 1653 o.GetNextAssoc(p,n,v);
1653 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1654 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1654 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1655 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1655 } 1656 }
1656 } 1657 }
1657} 1658}
1658void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1659void tftp::tftpRRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1659{ 1660{
1660 // MAY BE DANGEROUS! 1661 // MAY BE DANGEROUS!
1661UINT ptr = 0; 1662UINT ptr = 0;
1662 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1663 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1663 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1664 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1664 if(ops){ 1665 if(ops){
1665 tftpOptions& o = *ops; 1666 tftpOptions& o = *ops;
1666 POSITION p = o.GetStartPosition(); 1667 POSITION p = o.GetStartPosition();
1667 while(p){ 1668 while(p){
1668 CString n,v; 1669 CString n,v;
1669 o.GetNextAssoc(p,n,v); 1670 o.GetNextAssoc(p,n,v);
1670 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1671 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1671 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1672 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1672 } 1673 }
1673 } 1674 }
1674} 1675}
1675void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops) 1676void tftp::tftpWRQ::Set(LPCTSTR file,LPCTSTR type,tftp::tftpOptions* ops)
1676{ 1677{
1677 // MAY BE DANGEROUS! 1678 // MAY BE DANGEROUS!
1678UINT ptr = 0; 1679UINT ptr = 0;
1679 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1; 1680 strcpy((LPTSTR)&data[ptr],file); ptr+=strlen(file)+1;
1680 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1; 1681 strcpy((LPTSTR)&data[ptr],type); ptr+=strlen(type)+1;
1681 if(ops){ 1682 if(ops){
1682 tftpOptions& o = *ops; 1683 tftpOptions& o = *ops;
1683 POSITION p = o.GetStartPosition(); 1684 POSITION p = o.GetStartPosition();
1684 while(p){ 1685 while(p){
1685 CString n,v; 1686 CString n,v;
1686 o.GetNextAssoc(p,n,v); 1687 o.GetNextAssoc(p,n,v);
1687 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1688 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1688 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1689 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1689 } 1690 }
1690 } 1691 }
1691} 1692}
1692void tftp::tftpOACK::Set(tftpOptions* ops) 1693void tftp::tftpOACK::Set(tftpOptions* ops)
1693{ 1694{
1694 ASSERT(ops); 1695 ASSERT(ops);
1695UINT ptr = 0; 1696UINT ptr = 0;
1696tftpOptions& o = *ops; 1697tftpOptions& o = *ops;
1697POSITION p = o.GetStartPosition(); 1698POSITION p = o.GetStartPosition();
1698 while(p){ 1699 while(p){
1699 CString n,v; 1700 CString n,v;
1700 o.GetNextAssoc(p,n,v); 1701 o.GetNextAssoc(p,n,v);
1701 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1; 1702 strcpy((LPTSTR)&data[ptr],(LPCTSTR)n); ptr+=n.GetLength()+1;
1702 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1; 1703 strcpy((LPTSTR)&data[ptr],(LPCTSTR)v); ptr+=v.GetLength()+1;
1703 } 1704 }
1704} 1705}
1705 1706
1706void CWRQSocket::OnResolved() 1707void CWRQSocket::OnResolved()
1707{ 1708{
1708 CXferSocket::OnResolved(); 1709 CXferSocket::OnResolved();
1709 OnHostKnown(); 1710 OnHostKnown();
1710} 1711}
1711 1712
1712void CWRQSocket::OnHostKnown() 1713void CWRQSocket::OnHostKnown()
1713{ 1714{
1714 ASSERT(m_Daddy); 1715 ASSERT(m_Daddy);
1715 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort); 1716 m_Peer.sin_port=htons(m_Daddy->m_SpeakPort);
1716tftp::tftpOptions o; 1717tftp::tftpOptions o;
1717CString v; 1718CString v;
1718 o[tftpoTSize]="0"; 1719 o[tftpoTSize]="0";
1719 if(m__blkSize){ 1720 if(m__blkSize){
1720 v.Format("%u",m__blkSize); 1721 v.Format("%u",m__blkSize);
1721 o[tftpoBSize]=v; 1722 o[tftpoBSize]=v;
1722 } 1723 }
1723 if(m__timeOut){ 1724 if(m__timeOut){
1724 v.Format("%u",m__timeOut); 1725 v.Format("%u",m__timeOut);
1725 o[tftpoTOut]=v; 1726 o[tftpoTOut]=v;
1726 } 1727 }
1727 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o)); 1728 tftp*p = tftp::Allocate(tftp::tftpRRQ::tftpSize(m_FileName,m_Type,&o));
1728 ASSERT(p); 1729 ASSERT(p);
1729 p->SetOpcode(tftp::opRRQ); 1730 p->SetOpcode(tftp::opRRQ);
1730 p->data.m_RRQ.Set(m_FileName,m_Type,&o); 1731 p->data.m_RRQ.Set(m_FileName,m_Type,&o);
1731 PostTFTP(p,TRUE); 1732 PostTFTP(p,TRUE);
1732 state=stateInit; 1733 state=stateInit;
1733 UpdateList(); 1734 UpdateList();
1734} 1735}
1735 1736
1736void CPumpKINDlg::OnClose() 1737void CPumpKINDlg::OnClose()
1737{ 1738{
1738 OnTrayShowpumpkinwindow(); 1739 OnTrayShowpumpkinwindow();
1739} 1740}
1740 1741
1741void CPumpKINDlg::OnTrayShowpumpkinwindow() 1742void CPumpKINDlg::OnTrayShowpumpkinwindow()
1742{ 1743{
1743 if(IsWindowVisible()){ 1744 if(IsWindowVisible()){
1744 m_bShown=FALSE; 1745 m_bShown=FALSE;
1745 ShowWindow(SW_HIDE); 1746 ShowWindow(SW_HIDE);
1746 }else{ 1747 }else{
1747 m_bShown=TRUE; 1748 m_bShown=TRUE;
1748 ShowWindow(SW_SHOW); 1749 ShowWindow(SW_SHOW);
1749 SetForegroundWindow(); 1750 SetForegroundWindow();
1750 SetFocus(); 1751 SetFocus();
1751 } 1752 }
1752} 1753}
1753 1754
1754void CPumpKINDlg::OnTrayExit() 1755void CPumpKINDlg::OnTrayExit()
1755{ 1756{
1756 OnExit(); 1757 OnExit();
1757} 1758}
1758 1759
1759void CPumpKINDlg::OnTrayAboutpumpkin() 1760void CPumpKINDlg::OnTrayAboutpumpkin()
1760{ 1761{
1761CAboutDlg dlgAbout; 1762CAboutDlg dlgAbout;
1762 dlgAbout.DoModal(); 1763 dlgAbout.DoModal();
1763} 1764}
1764 1765
1765void CPumpKINDlg::OnTrayFetchfile() 1766void CPumpKINDlg::OnTrayFetchfile()
1766{ 1767{
1767 OnGet(); 1768 OnGet();
1768} 1769}
1769 1770
1770void CPumpKINDlg::OnTrayHelp() 1771void CPumpKINDlg::OnTrayHelp()
1771{ 1772{
1772 OnHelp(); 1773 OnHelp();
1773} 1774}
1774 1775
1775void CPumpKINDlg::OnTrayOptions() 1776void CPumpKINDlg::OnTrayOptions()
1776{ 1777{
1777 OnOptions(); 1778 OnOptions();
1778} 1779}
1779 1780
1780void CPumpKINDlg::OnTraySendfile() 1781void CPumpKINDlg::OnTraySendfile()
1781{ 1782{
1782 OnPut(); 1783 OnPut();
1783} 1784}
1784 1785
1785void CPumpKINDlg::LoadSettings() 1786void CPumpKINDlg::LoadSettings()
1786{ 1787{
1787CWinApp *app = AfxGetApp(); 1788CWinApp *app = AfxGetApp();
1788 ASSERT(app); 1789 ASSERT(app);
1789 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest); 1790 m_bnwRequest=app->GetProfileString("BellsNWhistles","Request",m_bnwRequest);
1790 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess); 1791 m_bnwSuccess=app->GetProfileString("BellsNWhistles","Success",m_bnwSuccess);
1791 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort); 1792 m_bnwAbort=app->GetProfileString("BellsNWhistles","Abort",m_bnwAbort);
1792 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1793 m_bTFTPSubdirs=app->GetProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1793 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1794 m_ListenPort=app->GetProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1794 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength); 1795 m_LogLength=app->GetProfileInt("UISettings","LogLength",m_LogLength);
1795 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1796 m_PromptTimeOut=app->GetProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1796 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1797 m_RRQMode=app->GetProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1797 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1798 m_SpeakPort=app->GetProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1798 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1799 m_TFTPRoot=app->GetProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1799 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds())); 1800 m_TFTPTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()));
1800 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1801 m_BlockSize=app->GetProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1801 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds())); 1802 m_RetryTimeOut=CTimeSpan(app->GetProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()));
1802 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1803 m_WRQMode=app->GetProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1803 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown); 1804 m_bShown=app->GetProfileInt("UISettings","Visble",m_bShown);
1804 if(m_TFTPRoot.IsEmpty()){ 1805 if(m_TFTPRoot.IsEmpty()){
1805 DWORD dL = ::GetCurrentDirectory(0,NULL); 1806 DWORD dL = ::GetCurrentDirectory(0,NULL);
1806 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL))); 1807 VERIFY(::GetCurrentDirectory(dL,m_TFTPRoot.GetBuffer(dL)));
1807 m_TFTPRoot.ReleaseBuffer(); 1808 m_TFTPRoot.ReleaseBuffer();
1808 } 1809 }
1809 ::SetCurrentDirectory(m_TFTPRoot); 1810 ::SetCurrentDirectory(m_TFTPRoot);
1810} 1811}
1811 1812
1812void CPumpKINDlg::SaveSettings() 1813void CPumpKINDlg::SaveSettings()
1813{ 1814{
1814CWinApp *app = AfxGetApp(); 1815CWinApp *app = AfxGetApp();
1815 ASSERT(app); 1816 ASSERT(app);
1816 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest); 1817 app->WriteProfileString("BellsNWhistles","Request",m_bnwRequest);
1817 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess); 1818 app->WriteProfileString("BellsNWhistles","Success",m_bnwSuccess);
1818 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort); 1819 app->WriteProfileString("BellsNWhistles","Abort",m_bnwAbort);
1819 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs); 1820 app->WriteProfileInt("TFTPSettings","Subdirs",m_bTFTPSubdirs);
1820 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort); 1821 app->WriteProfileInt("TFTPSettings","ListenPort",m_ListenPort);
1821 app->WriteProfileInt("UISettings","LogLength",m_LogLength); 1822 app->WriteProfileInt("UISettings","LogLength",m_LogLength);
1822 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut); 1823 app->WriteProfileInt("UISettings","PromptTimeout",m_PromptTimeOut);
1823 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode); 1824 app->WriteProfileInt("TFTPSettings","RRQMode",m_RRQMode);
1824 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort); 1825 app->WriteProfileInt("TFTPSettings","SpeakPort",m_SpeakPort);
1825 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot); 1826 app->WriteProfileString("TFTPSettings","TFTPRoot",m_TFTPRoot);
1826 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds()); 1827 app->WriteProfileInt("TFTPSettings","TFTPTimeout",m_TFTPTimeOut.GetTotalSeconds());
1827 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize); 1828 app->WriteProfileInt("TFTPSettings","TFTPBlockSize",m_BlockSize);
1828 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds()); 1829 app->WriteProfileInt("TFTPSettings","RetryTimeout",m_RetryTimeOut.GetTotalSeconds());
1829 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode); 1830 app->WriteProfileInt("TFTPSettings","WRQMode",m_WRQMode);
1830 app->WriteProfileInt("UISettings","Visble",m_bShown); 1831 app->WriteProfileInt("UISettings","Visble",m_bShown);
1831} 1832}
1832 1833
1833void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 1834void CPumpKINDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
1834{ 1835{
1835 CDialog::OnWindowPosChanging(lpwndpos); 1836 CDialog::OnWindowPosChanging(lpwndpos);
1836 if(!m_bExiting){ 1837 if(!m_bExiting){
1837 if(m_bShown){ 1838 if(m_bShown){
1838 lpwndpos->flags&=~SWP_HIDEWINDOW; 1839 lpwndpos->flags&=~SWP_HIDEWINDOW;
1839 lpwndpos->flags|=SWP_SHOWWINDOW; 1840 lpwndpos->flags|=SWP_SHOWWINDOW;
1840 }else{ 1841 }else{
1841 lpwndpos->flags&=~SWP_SHOWWINDOW; 1842 lpwndpos->flags&=~SWP_SHOWWINDOW;
1842 lpwndpos->flags|=SWP_HIDEWINDOW; 1843 lpwndpos->flags|=SWP_HIDEWINDOW;
1843 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu)) 1844 if(::GetForegroundWindow()==m_hWnd && (m_Trayer && !m_Trayer->m_inMenu))
1844 GetDesktopWindow()->SetForegroundWindow(); 1845 GetDesktopWindow()->SetForegroundWindow();
1845 } 1846 }
1846 } 1847 }
1847} 1848}
1848 1849
1849CString CXferSocket::ApplyRootGently(LPCTSTR fn) 1850CString CXferSocket::ApplyRootGently(LPCTSTR fn)
1850{ 1851{
1851CString f = fn; 1852CString f = fn;
1852CString rv = f; 1853CString rv = f;
1853 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0) 1854 if((!f.IsEmpty()) && f[0]!='\\' && f.Find(":")<0 && f.Find("\\")<0)
1854 rv = ApplyRoot(f); 1855 rv = ApplyRoot(f);
1855 return rv; 1856 return rv;
1856} 1857}
1857 1858
1858BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file) 1859BOOL CXferSocket::CheckBadRelativeness(LPCTSTR file)
1859{ 1860{
1860CString tmp = file; 1861CString tmp = file;
1861 if(tmp.IsEmpty()) 1862 if(tmp.IsEmpty())
1862 return FALSE; 1863 return FALSE;
1863 if(tmp.Find("..")>=0) 1864 if(tmp.Find("..")>=0)
1864 return TRUE; 1865 return TRUE;
1865 if(tmp.Find(":")>=0) 1866 if(tmp.Find(":")>=0)
1866 return TRUE; 1867 return TRUE;
1867 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0) 1868 if((!m_Daddy->m_bTFTPSubdirs) && m_FileName.Find('\\')>=0)
1868 return TRUE; 1869 return TRUE;
1869 return FALSE; 1870 return FALSE;
1870} 1871}
1871 1872
1872void CAboutDlg::OnKlevernet() 1873void CAboutDlg::OnKlevernet()
1873{ 1874{
1874CString url; 1875CString url;
1875 url.LoadString(IDS_KLEVERNET_URL); 1876 url.LoadString(IDS_KLEVERNET_URL);
1876 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED); 1877 ShellExecute(::GetDesktopWindow(),"open",url,NULL,NULL,SW_SHOWMAXIMIZED);
1877} 1878}
1878 1879
1879BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg) 1880BOOL CPumpKINDlg::PreTranslateMessage(MSG* pMsg)
1880{ 1881{
1881 // CG: The following block was added by the ToolTips component. 1882 // CG: The following block was added by the ToolTips component.
1882 { 1883 {
1883 // Let the ToolTip process this message. 1884 // Let the ToolTip process this message.
1884 m_tooltip.RelayEvent(pMsg); 1885 m_tooltip.RelayEvent(pMsg);
1885 1886
1886 return CDialog::PreTranslateMessage(pMsg); 1887 return CDialog::PreTranslateMessage(pMsg);
1887 } 1888 }
1888} 1889}
1889 1890
1890void CPumpKINDlg::OnSelchangeLog() 1891void CPumpKINDlg::OnSelchangeLog()
1891{ 1892{
1892int sel = m_Log.GetCurSel(); 1893int sel = m_Log.GetCurSel();
1893 if(sel==LB_ERR){ 1894 if(sel==LB_ERR){
1894 TRACE0("Error retrieving selection\n"); 1895 TRACE0("Error retrieving selection\n");
1895 }else{ 1896 }else{
1896 CTime *t = (CTime*)m_Log.GetItemData(sel); 1897 CTime *t = (CTime*)m_Log.GetItemData(sel);
1897 ASSERT(t); 1898 ASSERT(t);
1898 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log); 1899 m_tooltip.UpdateTipText(t->Format(IDS_LOGTIMEFORMAT),&m_Log);
1899 } 1900 }
1900} 1901}
1901 1902
1902void CPumpKINDlg::OnTrayOpenfilesfolder() 1903void CPumpKINDlg::OnTrayOpenfilesfolder()
1903{ 1904{
1904 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT); 1905 ShellExecute(::GetDesktopWindow(),NULL,m_TFTPRoot,NULL,NULL,SW_SHOWDEFAULT);
1905} 1906}
1906 1907
1907void CPumpKINDlg::OnDropFiles(HDROP hDropInfo) 1908void CPumpKINDlg::OnDropFiles(HDROP hDropInfo)
1908{ 1909{
1909UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); 1910UINT files = ::DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);
1910 ASSERT(files); 1911 ASSERT(files);
1911 for(UINT file=0;file<files;file++){ 1912 for(UINT file=0;file<files;file++){
1912 CString theFile; 1913 CString theFile;
1913 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0); 1914 UINT fileNameLength = ::DragQueryFile(hDropInfo,file,NULL,0);
1914 ASSERT(fileNameLength); 1915 ASSERT(fileNameLength);
1915 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength); 1916 VERIFY(::DragQueryFile(hDropInfo,file,theFile.GetBuffer(fileNameLength+5),fileNameLength+4)<=fileNameLength);
1916 theFile.ReleaseBuffer(); 1917 theFile.ReleaseBuffer();
1917 // Send it over! 1918 // Send it over!
1918 CRequestDlg crd(NULL); 1919 CRequestDlg crd(NULL);
1919 crd.m_Drop=TRUE; 1920 crd.m_Drop=TRUE;
1920 crd.m_Put=TRUE; 1921 crd.m_Put=TRUE;
1921 crd.m_BSize=m_BlockSize; 1922 crd.m_BSize=m_BlockSize;
1922 crd.m_LocalFile=theFile; 1923 crd.m_LocalFile=theFile;
1923 if(crd.DoModal()==IDOK){ 1924 if(crd.DoModal()==IDOK){
1924 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1925 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1925 if(crd.m_BSize) 1926 if(crd.m_BSize)
1926 socket->m__blkSize=crd.m_BSize; 1927 socket->m__blkSize=crd.m_BSize;
1927 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1928 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1928 socket->Destroy(); 1929 socket->Destroy();
1929 } 1930 }
1930 } 1931 }
1931 ::DragFinish(hDropInfo); 1932 ::DragFinish(hDropInfo);
1932} 1933}
1933 1934
1934void CPumpKINDlg::OnCancel() 1935void CPumpKINDlg::OnCancel()
1935{ 1936{
1936 OnClose(); 1937 OnClose();
1937} 1938}
1938 1939
1939CPumpKINDlg::~CPumpKINDlg() 1940CPumpKINDlg::~CPumpKINDlg()
1940{ 1941{
1941 delete m_Trayer; 1942 delete m_Trayer;
1942 delete m_Retrier; 1943 delete m_Retrier;
1943} 1944}
1944 1945
1945void CXferSocket::OnRetry() 1946void CXferSocket::OnRetry()
1946{ 1947{
1947 if(!m_Retry){ 1948 if(!m_Retry){
1948 TRACE("Retrying unretriable..\n"); 1949 TRACE("Retrying unretriable..\n");
1949 return; 1950 return;
1950 } 1951 }
1951 TRACE0("Retrying..\n"); 1952 TRACE0("Retrying..\n");
1952 m_bRetry=TRUE; 1953 m_bRetry=TRUE;
1953 PostTFTP(tftp::Copy(m_Retry)); 1954 PostTFTP(tftp::Copy(m_Retry));
1954 m_bRetry=FALSE; 1955 m_bRetry=FALSE;
1955} 1956}
1956 1957
1957tftp* tftp::Copy(tftp *src) 1958tftp* tftp::Copy(tftp *src)
1958{ 1959{
1959 ASSERT(src); 1960 ASSERT(src);
1960 ASSERT(src->length); 1961 ASSERT(src->length);
1961tftp* rv = Allocate(src->length); 1962tftp* rv = Allocate(src->length);
1962 ASSERT(rv); 1963 ASSERT(rv);
1963 memmove(rv,src,tftpSlackSize+src->length); 1964 memmove(rv,src,tftpSlackSize+src->length);
1964 return rv; 1965 return rv;
1965} 1966}
1966 1967
1967void CXferSocket::SetTry(tftp *p) 1968void CXferSocket::SetTry(tftp *p)
1968{ 1969{
1969 if(m_Retry) 1970 if(m_Retry)
1970 delete m_Retry; 1971 delete m_Retry;
1971 m_Retry=p?tftp::Copy(p):NULL; 1972 m_Retry=p?tftp::Copy(p):NULL;
1972} 1973}
1973 1974
1974void CPumpKINDlg::OnHelp() 1975void CPumpKINDlg::OnHelp()
1975{ 1976{
1976 AfxGetApp()->WinHelp(0,HELP_FINDER); 1977 AfxGetApp()->WinHelp(0,HELP_FINDER);
1977} 1978}