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