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