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