summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--PumpKINDlg.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index fc24596..b6b8a36 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -432,1107 +432,1115 @@ int saddrLen = sizeof(SOCKADDR_IN);
432 if(!length) 432 if(!length)
433 return FALSE; 433 return FALSE;
434 if(length==(tftpLength)SOCKET_ERROR) 434 if(length==(tftpLength)SOCKET_ERROR)
435 return FALSE; 435 return FALSE;
436 return TRUE; 436 return TRUE;
437} 437}
438 438
439UINT tftp::Opcode() 439UINT tftp::Opcode()
440{ 440{
441 return REVERSEBYTES(opcode); 441 return REVERSEBYTES(opcode);
442} 442}
443 443
444CString tftp::rqFileName() 444CString tftp::rqFileName()
445{ 445{
446 ASSERT(length); 446 ASSERT(length);
447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 447 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
448CString rv; 448CString rv;
449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode))) 449 if(memchr(&data.m_RQ.data,0,length-sizeof(opcode)))
450 rv = (LPCTSTR)data.m_RQ.data; 450 rv = (LPCTSTR)data.m_RQ.data;
451 return rv; 451 return rv;
452} 452}
453 453
454CString tftp::rqType() 454CString tftp::rqType()
455{ 455{
456 ASSERT(length); 456 ASSERT(length);
457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ); 457 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ);
458CString rv; 458CString rv;
459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 459char *tmp = (char*)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
460 if(tmp++) 460 if(tmp++)
461 rv = (LPCTSTR)tmp; 461 rv = (LPCTSTR)tmp;
462 return rv; 462 return rv;
463} 463}
464 464
465UINT tftp::GetOptions(tftp::tftpOptions* ops) 465UINT tftp::GetOptions(tftp::tftpOptions* ops)
466{ 466{
467 ASSERT(length); 467 ASSERT(length);
468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK); 468 ASSERT(Opcode()==opRRQ || Opcode()==opWRQ || Opcode()==opOACK);
469 ASSERT(ops); 469 ASSERT(ops);
470tftpOptions& o = *ops; 470tftpOptions& o = *ops;
471LPSTR base = (LPSTR)&data.m_RQ.data; 471LPSTR base = (LPSTR)&data.m_RQ.data;
472UINT basePtr = 0; 472UINT basePtr = 0;
473 if(Opcode()==opRRQ || Opcode()==opWRQ){ 473 if(Opcode()==opRRQ || Opcode()==opWRQ){
474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode)); 474 base = (LPSTR)memchr(&data.m_RQ.data,0,length-sizeof(opcode));
475 if(!base) 475 if(!base)
476 return 0; 476 return 0;
477 base++; 477 base++;
478 basePtr = (base-(LPSTR)&data.m_RQ.data); 478 basePtr = (base-(LPSTR)&data.m_RQ.data);
479 base = (LPSTR)memchr(base,0,length-basePtr); 479 base = (LPSTR)memchr(base,0,length-basePtr);
480 if(!base) 480 if(!base)
481 return 0; 481 return 0;
482 base++; 482 base++;
483 basePtr = (base-(LPSTR)&data.m_RQ.data); 483 basePtr = (base-(LPSTR)&data.m_RQ.data);
484 } 484 }
485 ops->RemoveAll(); 485 ops->RemoveAll();
486UINT rv = 0; 486UINT rv = 0;
487 while(basePtr<(length-sizeof(opcode))){ 487 while(basePtr<(length-sizeof(opcode))){
488 CString onam = (LPSTR)&data.m_RQ.data[basePtr]; 488 CString onam = (LPSTR)&data.m_RQ.data[basePtr];
489 basePtr+=onam.GetLength()+1; 489 basePtr+=onam.GetLength()+1;
490 CString oval = (LPSTR)&data.m_RQ.data[basePtr]; 490 CString oval = (LPSTR)&data.m_RQ.data[basePtr];
491 basePtr+=oval.GetLength()+1; 491 basePtr+=oval.GetLength()+1;
492 onam.MakeLower(); 492 onam.MakeLower();
493 o[onam]=oval; 493 o[onam]=oval;
494 rv++; 494 rv++;
495 } 495 }
496 return rv; 496 return rv;
497} 497}
498 498
499tftp::tftp() 499tftp::tftp()
500{ 500{
501 length=0; 501 length=0;
502} 502}
503 503
504 504
505void CXferSocket::OnSend(int nErrorCode) 505void CXferSocket::OnSend(int nErrorCode)
506{ 506{
507 if(nErrorCode){ 507 if(nErrorCode){
508 ASSERT(m_Daddy); 508 ASSERT(m_Daddy);
509 m_Daddy->LogLine(IDS_LOG_XFERSEND); 509 m_Daddy->LogLine(IDS_LOG_XFERSEND);
510 return; 510 return;
511 } 511 }
512 if(!m_Queue.IsEmpty()){ 512 if(!m_Queue.IsEmpty()){
513 tftp *p = m_Queue.GetHead(); 513 tftp *p = m_Queue.GetHead();
514 ASSERT(p); 514 ASSERT(p);
515 m_Queue.RemoveHead(); 515 m_Queue.RemoveHead();
516 if(!p->Send(this,&m_Peer)){ 516 if(!p->Send(this,&m_Peer)){
517 ASSERT(m_Daddy); 517 ASSERT(m_Daddy);
518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND); 518 m_Daddy->LogLine(IDS_LOG_XFERUDPSEND);
519 } 519 }
520 delete p; 520 delete p;
521 } 521 }
522 DoSelect(); 522 DoSelect();
523 if(m_Queue.IsEmpty()){ 523 if(m_Queue.IsEmpty()){
524 switch(state){ 524 switch(state){
525 case stateDeny: 525 case stateDeny:
526 Destroy(FALSE); 526 Destroy(FALSE);
527 break; 527 break;
528 case stateFinish: 528 case stateFinish:
529 Destroy(TRUE); 529 Destroy(TRUE);
530 break; 530 break;
531 } 531 }
532 } 532 }
533} 533}
534 534
535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) 535BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr)
536{ 536{
537 ASSERT(socket); 537 ASSERT(socket);
538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); 538int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN));
539 if(rv!=length) 539 if(rv!=length)
540 return FALSE; 540 return FALSE;
541 return TRUE; 541 return TRUE;
542} 542}
543 543
544void CXferSocket::DoSelect() 544void CXferSocket::DoSelect()
545{ 545{
546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE) 546 if(m_Peer.sin_addr.s_addr!=INADDR_NONE)
547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); 547 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE));
548} 548}
549 549
550void CXferSocket::OnReceive(int nErrorCode) 550void CXferSocket::OnReceive(int nErrorCode)
551{ 551{
552 if(nErrorCode){ 552 if(nErrorCode){
553 ASSERT(m_Daddy); 553 ASSERT(m_Daddy);
554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); 554 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE);
555 return; 555 return;
556 } 556 }
557 ASSERT(m_Daddy); 557 ASSERT(m_Daddy);
558DWORD fionread = 0; 558DWORD fionread = 0;
559 VERIFY(IOCtl(FIONREAD,&fionread)); 559 VERIFY(IOCtl(FIONREAD,&fionread));
560tftp *p = tftp::Allocate(fionread); 560tftp *p = tftp::Allocate(fionread);
561 ASSERT(p); 561 ASSERT(p);
562SOCKADDR_IN sin; 562SOCKADDR_IN sin;
563 if(!p->Receive(this,fionread,&sin)){ 563 if(!p->Receive(this,fionread,&sin)){
564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE); 564 m_Daddy->LogLine(IDS_LOG_XFERUDPRECEIVE);
565 delete p; 565 delete p;
566 }else 566 }else
567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){ 567 if(m_Peer.sin_addr.s_addr==INADDR_NONE){
568 m_Peer.sin_addr=sin.sin_addr; 568 m_Peer.sin_addr=sin.sin_addr;
569 m_Peer.sin_port=sin.sin_port; 569 m_Peer.sin_port=sin.sin_port;
570 } 570 }
571BOOL alive = TRUE; 571BOOL alive = TRUE;
572 if(state==stateInit){ 572 if(state==stateInit){
573 state=stateXfer; 573 state=stateXfer;
574 m_Peer.sin_port=sin.sin_port; 574 m_Peer.sin_port=sin.sin_port;
575 UpdateList(); 575 UpdateList();
576 } 576 }
577 if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){ 577 if(sin.sin_addr.s_addr!=m_Peer.sin_addr.s_addr || sin.sin_port!=m_Peer.sin_port){
578 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID); 578 m_Daddy->LogLine(IDS_LOG_XFERSOURCETID);
579 // *** Bounce it! 579 // *** Bounce it!
580 }else{ 580 }else{
581 alive = OnTFTP(p); 581 alive = OnTFTP(p);
582 } 582 }
583 delete p; 583 delete p;
584 if(alive){ 584 if(alive){
585 DoSelect(); 585 DoSelect();
586 ResetTimeout(); 586 ResetTimeout();
587 } 587 }
588} 588}
589 589
590void CXferSocket::SetPeer(SOCKADDR_IN *sin) 590void CXferSocket::SetPeer(SOCKADDR_IN *sin)
591{ 591{
592 ASSERT(sin); 592 ASSERT(sin);
593 memmove(&m_Peer,sin,sizeof(m_Peer)); 593 memmove(&m_Peer,sin,sizeof(m_Peer));
594} 594}
595 595
596void CXferSocket::UpdateList() 596void CXferSocket::UpdateList()
597{ 597{
598 ASSERT(m_Daddy); 598 ASSERT(m_Daddy);
599LV_FINDINFO lvf; 599LV_FINDINFO lvf;
600 memset(&lvf,0,sizeof(lvf)); 600 memset(&lvf,0,sizeof(lvf));
601 lvf.flags=LVFI_PARAM; 601 lvf.flags=LVFI_PARAM;
602 lvf.lParam=(LPARAM)this; 602 lvf.lParam=(LPARAM)this;
603int i = m_Daddy->m_List.FindItem(&lvf); 603int i = m_Daddy->m_List.FindItem(&lvf);
604 if(i<0){ 604 if(i<0){
605 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket))); 605 ASSERT(IsKindOf(RUNTIME_CLASS(CRRQSocket)) || IsKindOf(RUNTIME_CLASS(CWRQSocket)));
606 i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ); 606 i=m_Daddy->m_List.InsertItem(0,m_FileName,IsKindOf(RUNTIME_CLASS(CRRQSocket))?m_Daddy->m_iRRQ:m_Daddy->m_iWRQ);
607 ASSERT(!(i<0)); 607 ASSERT(!(i<0));
608 m_Daddy->m_List.SetItemData(i,(DWORD)this); 608 m_Daddy->m_List.SetItemData(i,(DWORD)this);
609 } 609 }
610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName); 610 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemFile,m_FileName);
611 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type); 611 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemType,m_Type);
612 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr)); 612 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemPeer,inet_ntoa(m_Peer.sin_addr));
613CString tmp; 613CString tmp;
614 tmp.Format(IDS_FMT_BYTES,GetACK()); 614 tmp.Format(IDS_FMT_BYTES,GetACK());
615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp); 615 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemBytes,tmp);
616 if(m_xferSize>=0){ 616 if(m_xferSize>=0){
617 tmp.Format(IDS_FMT_BYTES,m_xferSize); 617 tmp.Format(IDS_FMT_BYTES,m_xferSize);
618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp); 618 m_Daddy->m_List.SetItemText(i,CPumpKINDlg::subitemTSize,tmp);
619 } 619 }
620} 620}
621 621
622CXferSocket::CXferSocket() 622CXferSocket::CXferSocket()
623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 623 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
624 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 624 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
625 m__blkSize(512), m__timeOut(30) 625 m__blkSize(512), m__timeOut(30)
626{ 626{
627 m_Daddy=NULL; 627 m_Daddy=NULL;
628 m_Peer.sin_addr.s_addr=INADDR_NONE; 628 m_Peer.sin_addr.s_addr=INADDR_NONE;
629 m_Peer.sin_family=AF_INET; 629 m_Peer.sin_family=AF_INET;
630 state=stateNone; 630 state=stateNone;
631} 631}
632 632
633ULONG CXferSocket::GetACK() 633ULONG CXferSocket::GetACK()
634{ 634{
635 return 0; 635 return 0;
636} 636}
637 637
638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin) 638CXferSocket::CXferSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN* sin)
639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE), 639 : m_wndResolver(NULL), m_Retry(NULL), m_bRetry(FALSE),
640 m_blkSize(512), m_timeOut(30), m_xferSize(-1), 640 m_blkSize(512), m_timeOut(30), m_xferSize(-1),
641 m__blkSize(512), m__timeOut(30) 641 m__blkSize(512), m__timeOut(30)
642{ 642{
643 m_Peer.sin_family=AF_INET; 643 m_Peer.sin_family=AF_INET;
644 state=stateNone; 644 state=stateNone;
645 ASSERT(daddy); 645 ASSERT(daddy);
646 m_Daddy=daddy; 646 m_Daddy=daddy;
647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds(); 647 m_timeOut=m__timeOut=m_Daddy->m_TFTPTimeOut.GetTotalSeconds();
648 if(sin){ 648 if(sin){
649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr; 649 m_Peer.sin_addr.s_addr=sin->sin_addr.s_addr;
650 m_Peer.sin_port=sin->sin_port; 650 m_Peer.sin_port=sin->sin_port;
651 }else 651 }else
652 m_Peer.sin_addr.s_addr=INADDR_NONE; 652 m_Peer.sin_addr.s_addr=INADDR_NONE;
653 m_FileName=fileName; 653 m_FileName=fileName;
654 m_Type=type; 654 m_Type=type;
655} 655}
656 656
657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 657BOOL CRRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
658{ 658{
659 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 659 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
660 return FALSE; 660 return FALSE;
661 ASSERT(m_Daddy); 661 ASSERT(m_Daddy);
662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 662 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
663 m_Daddy->m_Xfers[m_hSocket]=this; 663 m_Daddy->m_Xfers[m_hSocket]=this;
664CString lFile = localFile?localFile:m_FileName; 664CString lFile = localFile?localFile:m_FileName;
665 TurnSlashes(lFile,TRUE); 665 TurnSlashes(lFile,TRUE);
666 UpdateList(); 666 UpdateList();
667 if(!localFile){// Check only if server 667 if(!localFile){// Check only if server
668 if(CheckBadRelativeness(m_FileName)){ 668 if(CheckBadRelativeness(m_FileName)){
669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 669 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
670 return TRUE; 670 return TRUE;
671 } 671 }
672 switch(m_Daddy->m_RRQMode){ 672 switch(m_Daddy->m_RRQMode){
673 case CPumpKINDlg::rrqGiveAll: 673 case CPumpKINDlg::rrqGiveAll:
674 break; 674 break;
675 case CPumpKINDlg::rrqAlwaysConfirm: 675 case CPumpKINDlg::rrqAlwaysConfirm:
676 if(ConfirmRequest()) 676 if(ConfirmRequest())
677 break; 677 break;
678 case CPumpKINDlg::rrqDenyAll: 678 case CPumpKINDlg::rrqDenyAll:
679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 679 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
680 return TRUE; 680 return TRUE;
681 } 681 }
682 } 682 }
683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile); 683CString fn = localFile?ApplyRootGently(lFile):ApplyRoot(lFile);
684CFileException e; 684CFileException e;
685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){ 685 if(!m_File.Open(fn,CFile::modeRead|CFile::shareDenyWrite,&e)){
686 if(localFile){ 686 if(localFile){
687 CString tmp; 687 CString tmp;
688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn); 688 tmp.Format(IDS_LOG_FAILEDLOCALFILE,fn);
689 m_Daddy->LogLine(tmp); 689 m_Daddy->LogLine(tmp);
690 return FALSE; 690 return FALSE;
691 } 691 }
692 Deny(&e); 692 Deny(&e);
693 return TRUE; 693 return TRUE;
694 } 694 }
695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION 695 m_xferSize=m_File.GetLength();// *** HANDLE EXCEPTION
696 if(hostName){ 696 if(hostName){
697 m_HostName=hostName; 697 m_HostName=hostName;
698 698
699 CString tmp; 699 CString tmp;
700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName); 700 tmp.Format(IDS_LOG_SENDING,m_FileName,m_HostName);
701 m_Daddy->LogLine(tmp); 701 m_Daddy->LogLine(tmp);
702 702
703 CString inAddr = hostName; 703 CString inAddr = hostName;
704 int at = inAddr.Find('@'); 704 int at = inAddr.Find('@');
705 if(at>=0) 705 if(at>=0)
706 inAddr=inAddr.Mid(at+1); 706 inAddr=inAddr.Mid(at+1);
707 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 707 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
708 ASSERT(!m_wndResolver); 708 ASSERT(!m_wndResolver);
709 m_wndResolver = new CResolver(this); 709 m_wndResolver = new CResolver(this);
710 ASSERT(m_wndResolver); 710 ASSERT(m_wndResolver);
711 return m_wndResolver->Resolve(); 711 return m_wndResolver->Resolve();
712 } 712 }
713 else 713 else
714 OnHostKnown(); 714 OnHostKnown();
715 }else{ 715 }else{
716 tftp::tftpOptions o; 716 tftp::tftpOptions o;
717 CString v; 717 CString v;
718 if(m_Options.Lookup(tftpoBSize,v)){ 718 if(m_Options.Lookup(tftpoBSize,v)){
719 m__blkSize=atoi(v); 719 m__blkSize=atoi(v);
720 if(m__blkSize){ 720 if(m__blkSize){
721 m_blkSize=m__blkSize; 721 m_blkSize=m__blkSize;
722 v.Format("%u",m_blkSize); 722 v.Format("%u",m_blkSize);
723 o[tftpoBSize]=v; 723 o[tftpoBSize]=v;
724 } 724 }
725 } 725 }
726 if(m_Options.Lookup(tftpoTSize,v)){ 726 if(m_Options.Lookup(tftpoTSize,v)){
727 v.Format("%lu",m_xferSize); 727 v.Format("%lu",m_xferSize);
728 o[tftpoTSize]=v; 728 o[tftpoTSize]=v;
729 } 729 }
730 if(m_Options.Lookup(tftpoTOut,v)){ 730 if(m_Options.Lookup(tftpoTOut,v)){
731 m__timeOut=atoi(v); 731 m__timeOut=atoi(v);
732 if(m__timeOut){ 732 if(m__timeOut){
733 m_timeOut=m__timeOut; 733 m_timeOut=m__timeOut;
734 v.Format("%u",m_timeOut); 734 v.Format("%u",m_timeOut);
735 o[tftpoTOut]=v; 735 o[tftpoTOut]=v;
736 } 736 }
737 } 737 }
738 state = stateXfer; 738 state = stateXfer;
739 m_ACK=0; 739 m_ACK=0;
740 if(o.GetCount()){ 740 if(o.GetCount()){
741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o)); 741 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&o));
742 ASSERT(p); 742 ASSERT(p);
743 p->SetOpcode(tftp::opOACK); 743 p->SetOpcode(tftp::opOACK);
744 p->data.m_OACK.Set(&o); 744 p->data.m_OACK.Set(&o);
745 PostTFTP(p,TRUE); 745 PostTFTP(p,TRUE);
746 }else 746 }else
747 DoXfer(); 747 DoXfer();
748 } 748 }
749 return TRUE; 749 return TRUE;
750} 750}
751 751
752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 752CRRQSocket::CRRQSocket(CPumpKINDlg *daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
753 : CXferSocket(daddy,fileName,type,sin) 753 : CXferSocket(daddy,fileName,type,sin)
754{ 754{
755 m_ACK=0; 755 m_ACK=0;
756 m_LastSlack=0; 756 m_LastSlack=0;
757} 757}
758 758
759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg) 759UINT tftp::tftpERROR::tftpSize(LPCTSTR msg)
760{ 760{
761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1; 761 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpERROR::tftpErrorCode)+strlen(msg)+1;
762} 762}
763 763
764tftp* tftp::Allocate(UINT tftpSize) 764tftp* tftp::Allocate(UINT tftpSize)
765{ 765{
766 ASSERT(tftpSize); 766 ASSERT(tftpSize);
767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize]; 767tftp* rv = (tftp*) new BYTE[tftpSlackSize+tftpSize];
768 ASSERT(rv); 768 ASSERT(rv);
769 rv->length=tftpSize; 769 rv->length=tftpSize;
770 return rv; 770 return rv;
771} 771}
772 772
773void tftp::errSet(UINT code,LPCTSTR msg) 773void tftp::errSet(UINT code,LPCTSTR msg)
774{ 774{
775 ASSERT(this); 775 ASSERT(this);
776 ASSERT(length>=data.m_ERROR.tftpSize(msg)); 776 ASSERT(length>=data.m_ERROR.tftpSize(msg));
777 strcpy((char*)data.m_ERROR.data,msg); 777 strcpy((char*)data.m_ERROR.data,msg);
778 data.m_ERROR.SetCode(code); 778 data.m_ERROR.SetCode(code);
779} 779}
780 780
781void CXferSocket::PostTFTP(tftp* p,BOOL retryable) 781void CXferSocket::PostTFTP(tftp* p,BOOL retryable)
782{ 782{
783 ASSERT(p); 783 ASSERT(p);
784 m_Queue.AddTail(p); 784 m_Queue.AddTail(p);
785 DoSelect(); 785 DoSelect();
786 if(!m_bRetry){ 786 if(!m_bRetry){
787 if(retryable) 787 if(retryable)
788 SetTry(p); 788 SetTry(p);
789 else 789 else
790 SetTry(); 790 SetTry();
791 } 791 }
792 ResetTimeout(); 792 ResetTimeout();
793} 793}
794 794
795void CXferSocket::Deny(UINT errCode,UINT errID) 795void CXferSocket::Deny(UINT errCode,UINT errID)
796{ 796{
797 PostError(errCode,errID); 797 PostError(errCode,errID);
798 state=stateDeny; 798 state=stateDeny;
799} 799}
800 800
801void CRRQSocket::DoXfer() 801void CRRQSocket::DoXfer()
802{ 802{
803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); 803tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
804 ASSERT(p); 804 ASSERT(p);
805 p->SetOpcode(tftp::opDATA); 805 p->SetOpcode(tftp::opDATA);
806 TRY{ 806 TRY{
807 m_File.Seek(m_ACK*m_blkSize,CFile::begin); 807 m_File.Seek(m_ACK*m_blkSize,CFile::begin);
808 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize); 808 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize);
809 p->data.m_DATA.SetBlock(m_ACK+1); 809 p->data.m_DATA.SetBlock(m_ACK+1);
810 p->length=p->length-m_blkSize+bytes; 810 p->length=p->length-m_blkSize+bytes;
811 m_LastSlack = m_blkSize-bytes; 811 m_LastSlack = m_blkSize-bytes;
812 PostTFTP(p); 812 PostTFTP(p);
813 if(bytes<m_blkSize){ 813 if(bytes<m_blkSize){
814 state=stateFinish; 814 state=stateFinish;
815 ASSERT(m_Daddy); 815 ASSERT(m_Daddy);
816 CString tmp; 816 CString tmp;
817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName); 817 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
818 m_Daddy->LogLine(tmp); 818 m_Daddy->LogLine(tmp);
819 } 819 }
820 }CATCH(CFileException,e){ 820 }CATCH(CFileException,e){
821 Deny(e); 821 Deny(e);
822 }END_CATCH 822 }END_CATCH
823} 823}
824 824
825UINT tftp::tftpDATA::tftpSize(UINT blkSize) 825UINT tftp::tftpDATA::tftpSize(UINT blkSize)
826{ 826{
827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA) 827 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
828 -sizeof(BYTE)+blkSize; 828 -sizeof(BYTE)+blkSize;
829} 829}
830 830
831void CXferSocket::Deny(CFileException* e) 831void CXferSocket::Deny(CFileException* e)
832{ 832{
833 PostError(e); 833 PostError(e);
834 state=stateDeny; 834 state=stateDeny;
835} 835}
836 836
837void CXferSocket::PostError(UINT errCode,UINT errID) 837void CXferSocket::PostError(UINT errCode,UINT errID)
838{ 838{
839CString msg; 839CString msg;
840 msg.LoadString(errID); 840 msg.LoadString(errID);
841 ASSERT(m_Daddy); 841 ASSERT(m_Daddy);
842 /*// *** 842 /*// ***
843CString tmp; 843CString tmp;
844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg); 844 tmp.Format(IDS_LOG_SENTTFTPERROR,errCode,(LPCTSTR)msg);
845 m_Daddy->LogLine(tmp); 845 m_Daddy->LogLine(tmp);
846 */ 846 */
847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg)); 847tftp* err = tftp::Allocate(tftp::tftpERROR::tftpSize(msg));
848err->SetOpcode(tftp::opERROR); 848err->SetOpcode(tftp::opERROR);
849 err->errSet(errCode,msg); 849 err->errSet(errCode,msg);
850 PostTFTP(err); 850 PostTFTP(err);
851} 851}
852 852
853void CXferSocket::PostError(CFileException* e) 853void CXferSocket::PostError(CFileException* e)
854{ 854{
855UINT eCode; 855UINT eCode;
856UINT eMsgID; 856UINT eMsgID;
857 switch(e->m_cause){ 857 switch(e->m_cause){
858 case CFileException::fileNotFound: 858 case CFileException::fileNotFound:
859 eCode=tftp::errNotFound; 859 eCode=tftp::errNotFound;
860 eMsgID=IDS_TFTP_ERROR_NOTFOUND; 860 eMsgID=IDS_TFTP_ERROR_NOTFOUND;
861 break; 861 break;
862 case CFileException::accessDenied: 862 case CFileException::accessDenied:
863 eCode=tftp::errAccessViolation; 863 eCode=tftp::errAccessViolation;
864 eMsgID=IDS_TFTP_ERROR_ACCESS; 864 eMsgID=IDS_TFTP_ERROR_ACCESS;
865 break; 865 break;
866 case CFileException::directoryFull: 866 case CFileException::directoryFull:
867 eCode=tftp::errDiskFull; 867 eCode=tftp::errDiskFull;
868 eMsgID=IDS_TFTP_ERROR_DIRFULL; 868 eMsgID=IDS_TFTP_ERROR_DIRFULL;
869 break; 869 break;
870 case CFileException::sharingViolation: 870 case CFileException::sharingViolation:
871 eCode=tftp::errAccessViolation; 871 eCode=tftp::errAccessViolation;
872 eMsgID=IDS_TFTP_ERROR_SHARING; 872 eMsgID=IDS_TFTP_ERROR_SHARING;
873 break; 873 break;
874 case CFileException::diskFull: 874 case CFileException::diskFull:
875 eCode=tftp::errDiskFull; 875 eCode=tftp::errDiskFull;
876 eMsgID=IDS_TFTP_ERROR_DISKFULL; 876 eMsgID=IDS_TFTP_ERROR_DISKFULL;
877 break; 877 break;
878 default: 878 default:
879 eCode=tftp::errUndefined; 879 eCode=tftp::errUndefined;
880 eMsgID=IDS_TFTP_ERROR_UNDEFINED; 880 eMsgID=IDS_TFTP_ERROR_UNDEFINED;
881 break; 881 break;
882 } 882 }
883 PostError(eCode,eMsgID); 883 PostError(eCode,eMsgID);
884} 884}
885 885
886ULONG CRRQSocket::GetACK(void) 886ULONG CRRQSocket::GetACK(void)
887{ 887{
888 return (m_ACK*m_blkSize)-m_LastSlack; 888 return (m_ACK*m_blkSize)-m_LastSlack;
889} 889}
890 890
891BOOL CRRQSocket::OnTFTP(tftp* p) 891BOOL CRRQSocket::OnTFTP(tftp* p)
892{ 892{
893BOOL rv = TRUE; 893BOOL rv = TRUE;
894 switch(p->Opcode()){ 894 switch(p->Opcode()){
895 case tftp::opOACK: 895 case tftp::opOACK:
896 m_ACK=0; 896 m_ACK=0;
897 ASSERT(state!=stateFinish); 897 ASSERT(state!=stateFinish);
898 { 898 {
899 tftp::tftpOptions o; 899 tftp::tftpOptions o;
900 if(p->GetOptions(&o)){ 900 if(p->GetOptions(&o)){
901 CString v; 901 CString v;
902 if(o.Lookup(tftpoBSize,v)){ 902 if(o.Lookup(tftpoBSize,v)){
903 m_blkSize=atoi(v); 903 m_blkSize=atoi(v);
904 if(!m_blkSize){// *** More sanity checks 904 if(!m_blkSize){// *** More sanity checks
905 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 905 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
906 rv = TRUE; 906 rv = TRUE;
907 break; 907 break;
908 } 908 }
909 } 909 }
910 if(o.Lookup(tftpoTOut,v)){ 910 if(o.Lookup(tftpoTOut,v)){
911 m_timeOut=atoi(v); 911 m_timeOut=atoi(v);
912 if(!m_timeOut){// *** More sanity checks 912 if(!m_timeOut){// *** More sanity checks
913 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 913 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
914 rv = TRUE; 914 rv = TRUE;
915 break; 915 break;
916 } 916 }
917 } 917 }
918 if(o.Lookup(tftpoXResume,v)){ 918 if(o.Lookup(tftpoXResume,v)){
919 m_ACK=atoi(v); 919 m_ACK=atoi(v);
920 } 920 }
921 } 921 }
922 UpdateList(); 922 UpdateList();
923 DoXfer(); 923 DoXfer();
924 } 924 }
925 break; 925 break;
926 case tftp::opACK: 926 case tftp::opACK:
927 m_ACK=p->data.m_ACK.Block(); 927 m_ACK=p->data.m_ACK.Block();
928 if(state!=stateFinish){ 928 if(state!=stateFinish){
929 UpdateList(); 929 UpdateList();
930 DoXfer(); 930 DoXfer();
931 } 931 }
932 break; 932 break;
933 case tftp::opERROR: 933 case tftp::opERROR:
934 { 934 {
935 ASSERT(m_Daddy); 935 ASSERT(m_Daddy);
936 CString tmp; 936 CString tmp;
937 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 937 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
938 m_Daddy->LogLine(tmp); 938 m_Daddy->LogLine(tmp);
939 } 939 }
940 Destroy(FALSE); 940 Destroy(FALSE);
941 rv = FALSE; 941 rv = FALSE;
942 break; 942 break;
943 default: 943 default:
944 ASSERT(m_Daddy); 944 {
945 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 945 ASSERT(m_Daddy);
946 // *** Self destruct maybe?? 946 CString tmp;
947 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
948 m_Daddy->LogLine(tmp);
949 // *** Self destruct maybe??
950 }
947 break; 951 break;
948 } 952 }
949 return rv; 953 return rv;
950} 954}
951 955
952BOOL CWRQSocket::OnTFTP(tftp* p) 956BOOL CWRQSocket::OnTFTP(tftp* p)
953{ 957{
954 switch(p->Opcode()){ 958 switch(p->Opcode()){
955 case tftp::opOACK: 959 case tftp::opOACK:
956 ASSERT(state!=stateFinish); 960 ASSERT(state!=stateFinish);
957 { 961 {
958 if(m_bResume) 962 if(m_bResume)
959 m_ACK=m_File.GetLength()/m_blkSize; 963 m_ACK=m_File.GetLength()/m_blkSize;
960 else 964 else
961 m_ACK=0; 965 m_ACK=0;
962 tftp::tftpOptions o; 966 tftp::tftpOptions o;
963 if(p->GetOptions(&o)){ 967 if(p->GetOptions(&o)){
964 CString v; 968 CString v;
965 if(o.Lookup(tftpoBSize,v)){ 969 if(o.Lookup(tftpoBSize,v)){
966 m_blkSize=atoi(v); 970 m_blkSize=atoi(v);
967 if(!m_blkSize){// *** More sanity checks 971 if(!m_blkSize){// *** More sanity checks
968 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 972 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
969 return TRUE; 973 return TRUE;
970 } 974 }
971 } 975 }
972 if(o.Lookup(tftpoTOut,v)){ 976 if(o.Lookup(tftpoTOut,v)){
973 m_timeOut=atoi(v); 977 m_timeOut=atoi(v);
974 if(!m_timeOut){// *** More sanity checks 978 if(!m_timeOut){// *** More sanity checks
975 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 979 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
976 return TRUE; 980 return TRUE;
977 } 981 }
978 } 982 }
979 if(o.Lookup(tftpoTSize,v)){ 983 if(o.Lookup(tftpoTSize,v)){
980 m_xferSize=atoi(v); 984 m_xferSize=atoi(v);
981 } 985 }
982 } 986 }
983 UpdateList(); 987 UpdateList();
984 DoXfer(); 988 DoXfer();
985 } 989 }
986 break; 990 break;
987 case tftp::opDATA: 991 case tftp::opDATA:
988 { 992 {
989 UINTblock = p->data.m_DATA.Block(); 993 UINTblock = p->data.m_DATA.Block();
990 TRY{ 994 TRY{
991 m_File.Seek((block-1)*m_blkSize,CFile::begin); 995 m_File.Seek((block-1)*m_blkSize,CFile::begin);
992 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); 996 int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize);
993 if(bytes){ 997 if(bytes){
994 m_File.Write(p->data.m_DATA.data,bytes); 998 m_File.Write(p->data.m_DATA.data,bytes);
995 // *** Move to the other place where we can do it not that often 999 // *** Move to the other place where we can do it not that often
996 m_File.SetLength(m_File.GetPosition()); 1000 m_File.SetLength(m_File.GetPosition());
997 } 1001 }
998 if(bytes<m_blkSize){ 1002 if(bytes<m_blkSize){
999 state=stateFinish; 1003 state=stateFinish;
1000 ASSERT(m_Daddy); 1004 ASSERT(m_Daddy);
1001 CString tmp; 1005 CString tmp;
1002 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); 1006 tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName);
1003 m_Daddy->LogLine(tmp); 1007 m_Daddy->LogLine(tmp);
1004 } 1008 }
1005 m_ACK=block; 1009 m_ACK=block;
1006 m_LastSlack=m_blkSize-bytes; 1010 m_LastSlack=m_blkSize-bytes;
1007 UpdateList(); 1011 UpdateList();
1008 DoXfer(); 1012 DoXfer();
1009 }CATCH(CFileException,e){ 1013 }CATCH(CFileException,e){
1010 Deny(e); 1014 Deny(e);
1011 }END_CATCH 1015 }END_CATCH
1012 } 1016 }
1013 break; 1017 break;
1014 case tftp::opERROR: 1018 case tftp::opERROR:
1015 { 1019 {
1016 ASSERT(m_Daddy); 1020 ASSERT(m_Daddy);
1017 CString tmp; 1021 CString tmp;
1018 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 1022 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
1019 m_Daddy->LogLine(tmp); 1023 m_Daddy->LogLine(tmp);
1020 } 1024 }
1021 Destroy(FALSE); 1025 Destroy(FALSE);
1022 return FALSE; 1026 return FALSE;
1023 default: 1027 default:
1024 ASSERT(m_Daddy); 1028 {
1025 m_Daddy->LogLine(IDS_LOG_XFEROPCODE); 1029 ASSERT(m_Daddy);
1026 // *** Self destruct maybe?? 1030 CString tmp;
1031 tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode());
1032 m_Daddy->LogLine(tmp);
1033 // *** Self destruct maybe??
1034 }
1027 break; 1035 break;
1028 } 1036 }
1029 return TRUE; 1037 return TRUE;
1030} 1038}
1031 1039
1032void tftp::SetOpcode(WORD op) 1040void tftp::SetOpcode(WORD op)
1033{ 1041{
1034 opcode = REVERSEBYTES(op); 1042 opcode = REVERSEBYTES(op);
1035} 1043}
1036void tftp::tftpDATA::SetBlock(WORD b) 1044void tftp::tftpDATA::SetBlock(WORD b)
1037{ 1045{
1038 block=REVERSEBYTES(b); 1046 block=REVERSEBYTES(b);
1039} 1047}
1040WORD tftp::tftpDATA::Block() 1048WORD tftp::tftpDATA::Block()
1041{ 1049{
1042 return REVERSEBYTES(block); 1050 return REVERSEBYTES(block);
1043} 1051}
1044WORD tftp::tftpACK::Block() 1052WORD tftp::tftpACK::Block()
1045{ 1053{
1046 return REVERSEBYTES(block); 1054 return REVERSEBYTES(block);
1047} 1055}
1048void tftp::tftpACK::SetBlock(WORD b) 1056void tftp::tftpACK::SetBlock(WORD b)
1049{ 1057{
1050 block = REVERSEBYTES(b); 1058 block = REVERSEBYTES(b);
1051} 1059}
1052WORD tftp::tftpERROR::Code() 1060WORD tftp::tftpERROR::Code()
1053{ 1061{
1054 return REVERSEBYTES(code); 1062 return REVERSEBYTES(code);
1055} 1063}
1056void tftp::tftpERROR::SetCode(WORD c) 1064void tftp::tftpERROR::SetCode(WORD c)
1057{ 1065{
1058 code = REVERSEBYTES(c); 1066 code = REVERSEBYTES(c);
1059} 1067}
1060 1068
1061 1069
1062CString tftp::errMessage() 1070CString tftp::errMessage()
1063{ 1071{
1064CString rv; 1072CString rv;
1065 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code))) 1073 if(memchr(data.m_ERROR.data,0,length-(tftpHdrSize-tftpSlackSize)-sizeof(data.m_ERROR.code)))
1066 rv = (LPCTSTR)data.m_ERROR.data; 1074 rv = (LPCTSTR)data.m_ERROR.data;
1067 return rv; 1075 return rv;
1068} 1076}
1069 1077
1070void CXferSocket::Destroy(BOOL success) 1078void CXferSocket::Destroy(BOOL success)
1071{ 1079{
1072 if(m_wndResolver){ 1080 if(m_wndResolver){
1073 delete m_wndResolver; 1081 delete m_wndResolver;
1074 m_wndResolver=NULL; 1082 m_wndResolver=NULL;
1075 } 1083 }
1076 SetTry(); 1084 SetTry();
1077 m_Daddy->m_bnw.StartSound( 1085 m_Daddy->m_bnw.StartSound(
1078 success 1086 success
1079 ? m_Daddy->m_bnwSuccess 1087 ? m_Daddy->m_bnwSuccess
1080 : m_Daddy->m_bnwAbort 1088 : m_Daddy->m_bnwAbort
1081 ); 1089 );
1082 if(m_File.m_hFile!=CFile::hFileNull){ 1090 if(m_File.m_hFile!=CFile::hFileNull){
1083 TRY{ 1091 TRY{
1084 m_File.Close(); 1092 m_File.Close();
1085 }CATCH(CFileException,e){ 1093 }CATCH(CFileException,e){
1086 TRACE0("Error closing file\n"); 1094 TRACE0("Error closing file\n");
1087 }END_CATCH 1095 }END_CATCH
1088 } 1096 }
1089 ASSERT(m_Daddy); 1097 ASSERT(m_Daddy);
1090 m_Daddy->KillTimer(m_hSocket); 1098 m_Daddy->KillTimer(m_hSocket);
1091 m_Daddy->m_Xfers.RemoveKey(m_hSocket); 1099 m_Daddy->m_Xfers.RemoveKey(m_hSocket);
1092LV_FINDINFO lvf; 1100LV_FINDINFO lvf;
1093 memset(&lvf,0,sizeof(lvf)); 1101 memset(&lvf,0,sizeof(lvf));
1094 lvf.flags=LVFI_PARAM; 1102 lvf.flags=LVFI_PARAM;
1095 lvf.lParam=(LPARAM)this; 1103 lvf.lParam=(LPARAM)this;
1096int i = m_Daddy->m_List.FindItem(&lvf); 1104int i = m_Daddy->m_List.FindItem(&lvf);
1097 if(i>=0) 1105 if(i>=0)
1098 m_Daddy->m_List.DeleteItem(i); 1106 m_Daddy->m_List.DeleteItem(i);
1099 delete this; 1107 delete this;
1100} 1108}
1101 1109
1102void CPumpKINDlg::LogLine(LPCTSTR str) 1110void CPumpKINDlg::LogLine(LPCTSTR str)
1103{ 1111{
1104 ASSERT(m_LogLength); 1112 ASSERT(m_LogLength);
1105 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){ 1113 while(m_Log.GetCount()>m_LogLength && m_Log.GetCount()!=LB_ERR){
1106 CTime *t = (CTime*)m_Log.GetItemData(0); 1114 CTime *t = (CTime*)m_Log.GetItemData(0);
1107 if(((DWORD)t)!=LB_ERR){ 1115 if(((DWORD)t)!=LB_ERR){
1108 ASSERT(t); 1116 ASSERT(t);
1109 m_LogTimes.RemoveKey(t); 1117 m_LogTimes.RemoveKey(t);
1110 delete t; 1118 delete t;
1111 } 1119 }
1112 m_Log.DeleteString(0); 1120 m_Log.DeleteString(0);
1113 } 1121 }
1114int i = m_Log.AddString(str); 1122int i = m_Log.AddString(str);
1115 ASSERT(i!=LB_ERR); 1123 ASSERT(i!=LB_ERR);
1116CTime *t = new CTime(CTime::GetCurrentTime()); 1124CTime *t = new CTime(CTime::GetCurrentTime());
1117 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t)); 1125 m_Log.SetItemData(i,(DWORD)(m_LogTimes[t]=t));
1118 m_Log.SetCurSel(i); 1126 m_Log.SetCurSel(i);
1119} 1127}
1120 1128
1121void CPumpKINDlg::LogLine(UINT msgID) 1129void CPumpKINDlg::LogLine(UINT msgID)
1122{ 1130{
1123CString tmp; 1131CString tmp;
1124 tmp.Format(msgID); 1132 tmp.Format(msgID);
1125 LogLine(tmp); 1133 LogLine(tmp);
1126} 1134}
1127 1135
1128void CXferSocket::TurnSlashes(CString& fn,BOOL bBack) 1136void CXferSocket::TurnSlashes(CString& fn,BOOL bBack)
1129{ 1137{
1130 ints = fn.Find(bBack?'/':'\\'); 1138 ints = fn.Find(bBack?'/':'\\');
1131 while(s>=0){ 1139 while(s>=0){
1132 fn.SetAt(s,bBack?'\\':'/'); 1140 fn.SetAt(s,bBack?'\\':'/');
1133 s = fn.Find(bBack?'/':'\\'); 1141 s = fn.Find(bBack?'/':'\\');
1134 } 1142 }
1135} 1143}
1136 1144
1137CString CXferSocket::ApplyRoot(LPCTSTR fileName) 1145CString CXferSocket::ApplyRoot(LPCTSTR fileName)
1138{ 1146{
1139 ASSERT(m_Daddy); 1147 ASSERT(m_Daddy);
1140CString fn = fileName; 1148CString fn = fileName;
1141CString rv = m_Daddy->m_TFTPRoot; 1149CString rv = m_Daddy->m_TFTPRoot;
1142 if(rv.IsEmpty()) 1150 if(rv.IsEmpty())
1143 rv = "."; 1151 rv = ".";
1144 if(rv[rv.GetLength()-1]!='\\') 1152 if(rv[rv.GetLength()-1]!='\\')
1145 rv+="\\"; 1153 rv+="\\";
1146 while((!fn.IsEmpty()) && fn[0]=='\\') 1154 while((!fn.IsEmpty()) && fn[0]=='\\')
1147 fn=fn.Mid(1); 1155 fn=fn.Mid(1);
1148 rv+=fn; 1156 rv+=fn;
1149 return rv; 1157 return rv;
1150} 1158}
1151 1159
1152void CPumpKINDlg::OnOptions() 1160void CPumpKINDlg::OnOptions()
1153{ 1161{
1154CPropertySheet cps(IDS_TITLE_OPTIONS,this); 1162CPropertySheet cps(IDS_TITLE_OPTIONS,this);
1155CPropsServer server; 1163CPropsServer server;
1156CPropsNetwork network; 1164CPropsNetwork network;
1157CPropsSounds sounds; 1165CPropsSounds sounds;
1158 1166
1159 server.m_RRQMode=m_RRQMode; 1167 server.m_RRQMode=m_RRQMode;
1160 server.m_TFTPRoot=m_TFTPRoot; 1168 server.m_TFTPRoot=m_TFTPRoot;
1161 server.m_TFTPSubdirs=m_bTFTPSubdirs; 1169 server.m_TFTPSubdirs=m_bTFTPSubdirs;
1162 server.m_WRQMode=m_WRQMode; 1170 server.m_WRQMode=m_WRQMode;
1163 server.m_PromptTimeOut=m_PromptTimeOut; 1171 server.m_PromptTimeOut=m_PromptTimeOut;
1164 1172
1165 network.m_ListenPort=m_ListenPort; 1173 network.m_ListenPort=m_ListenPort;
1166 network.m_SpeakPort=m_SpeakPort; 1174 network.m_SpeakPort=m_SpeakPort;
1167 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds(); 1175 network.m_TimeOut=m_TFTPTimeOut.GetTotalSeconds();
1168 network.m_BlockSize=m_BlockSize; 1176 network.m_BlockSize=m_BlockSize;
1169 1177
1170 sounds.m_Request = m_bnwRequest; 1178 sounds.m_Request = m_bnwRequest;
1171 sounds.m_Success = m_bnwSuccess; 1179 sounds.m_Success = m_bnwSuccess;
1172 sounds.m_Abort = m_bnwAbort; 1180 sounds.m_Abort = m_bnwAbort;
1173 1181
1174 cps.AddPage(&server); 1182 cps.AddPage(&server);
1175 cps.AddPage(&network); 1183 cps.AddPage(&network);
1176 cps.AddPage(&sounds); 1184 cps.AddPage(&sounds);
1177 if(cps.DoModal()==IDOK){ 1185 if(cps.DoModal()==IDOK){
1178 m_RRQMode=server.m_RRQMode; 1186 m_RRQMode=server.m_RRQMode;
1179 m_TFTPRoot=server.m_TFTPRoot; 1187 m_TFTPRoot=server.m_TFTPRoot;
1180 m_bTFTPSubdirs=server.m_TFTPSubdirs; 1188 m_bTFTPSubdirs=server.m_TFTPSubdirs;
1181 m_WRQMode=server.m_WRQMode; 1189 m_WRQMode=server.m_WRQMode;
1182 m_PromptTimeOut=server.m_PromptTimeOut; 1190 m_PromptTimeOut=server.m_PromptTimeOut;
1183 1191
1184 m_ListenPort=network.m_ListenPort; 1192 m_ListenPort=network.m_ListenPort;
1185 m_SpeakPort=network.m_SpeakPort; 1193 m_SpeakPort=network.m_SpeakPort;
1186 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut); 1194 m_TFTPTimeOut=CTimeSpan(network.m_TimeOut);
1187 m_BlockSize=network.m_BlockSize; 1195 m_BlockSize=network.m_BlockSize;
1188 1196
1189 m_bnwRequest = sounds.m_Request; 1197 m_bnwRequest = sounds.m_Request;
1190 m_bnwSuccess = sounds.m_Success; 1198 m_bnwSuccess = sounds.m_Success;
1191 m_bnwAbort = sounds.m_Abort; 1199 m_bnwAbort = sounds.m_Abort;
1192 } 1200 }
1193} 1201}
1194 1202
1195BOOL CRRQSocket::ConfirmRequest() 1203BOOL CRRQSocket::ConfirmRequest()
1196{ 1204{
1197CConfirmRRQDlg cd(NULL); 1205CConfirmRRQDlg cd(NULL);
1198 cd.m_Daddy=this; 1206 cd.m_Daddy=this;
1199 cd.m_File=m_FileName; 1207 cd.m_File=m_FileName;
1200 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1208 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1201 if(cd.DoModal()==IDOK) 1209 if(cd.DoModal()==IDOK)
1202 return TRUE; 1210 return TRUE;
1203 return FALSE; 1211 return FALSE;
1204} 1212}
1205 1213
1206CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin) 1214CWRQSocket::CWRQSocket(CPumpKINDlg* daddy,LPCTSTR fileName,LPCTSTR type,SOCKADDR_IN *sin)
1207 : CXferSocket(daddy,fileName,type,sin) 1215 : CXferSocket(daddy,fileName,type,sin)
1208{ 1216{
1209 state=stateNone; 1217 state=stateNone;
1210 m_ACK=0; 1218 m_ACK=0;
1211 m_LastSlack=0; 1219 m_LastSlack=0;
1212 m_bResume=FALSE; 1220 m_bResume=FALSE;
1213} 1221}
1214 1222
1215BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName) 1223BOOL CWRQSocket::Create(LPCTSTR localFile,LPCTSTR hostName)
1216{ 1224{
1217 if(!CAsyncSocket::Create(0,SOCK_DGRAM)) 1225 if(!CAsyncSocket::Create(0,SOCK_DGRAM))
1218 return FALSE; 1226 return FALSE;
1219 ASSERT(m_Daddy); 1227 ASSERT(m_Daddy);
1220 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName); 1228 ASSERT(m_Peer.sin_addr.s_addr!=INADDR_NONE || hostName);
1221 m_Daddy->m_Xfers[m_hSocket]=this; 1229 m_Daddy->m_Xfers[m_hSocket]=this;
1222 UpdateList(); 1230 UpdateList();
1223CString lf; 1231CString lf;
1224 if(!localFile) { 1232 if(!localFile) {
1225 lf = m_FileName; 1233 lf = m_FileName;
1226 TurnSlashes(lf,TRUE); 1234 TurnSlashes(lf,TRUE);
1227 } 1235 }
1228CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf); 1236CString fn = localFile?ApplyRootGently(localFile):ApplyRoot(lf);
1229 if(!localFile){// This is an incoming request.. 1237 if(!localFile){// This is an incoming request..
1230 if(CheckBadRelativeness(m_FileName)){ 1238 if(CheckBadRelativeness(m_FileName)){
1231 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1239 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1232 return TRUE; 1240 return TRUE;
1233 } 1241 }
1234 BOOL exists; 1242 BOOL exists;
1235 if(!_access((LPCTSTR)fn,0)) 1243 if(!_access((LPCTSTR)fn,0))
1236 m_Rename=exists=TRUE; 1244 m_Rename=exists=TRUE;
1237 else 1245 else
1238 m_Rename=exists=FALSE; 1246 m_Rename=exists=FALSE;
1239 // *** m_WRQMode only if server transfer 1247 // *** m_WRQMode only if server transfer
1240 switch(m_Daddy->m_WRQMode){ 1248 switch(m_Daddy->m_WRQMode){
1241 case CPumpKINDlg::wrqTakeAll: 1249 case CPumpKINDlg::wrqTakeAll:
1242 if(exists){ 1250 if(exists){
1243 if(!RenameFile(fn)){ 1251 if(!RenameFile(fn)){
1244 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME); 1252 Deny(tftp::errDiskFull,IDS_TFTP_ERROR_FAILEDTORENAME);
1245 return TRUE; 1253 return TRUE;
1246 } 1254 }
1247 } 1255 }
1248 break; 1256 break;
1249 case CPumpKINDlg::wrqConfirmIfExists: 1257 case CPumpKINDlg::wrqConfirmIfExists:
1250 if(!exists) 1258 if(!exists)
1251 break; 1259 break;
1252 case CPumpKINDlg::wrqAlwaysConfirm: 1260 case CPumpKINDlg::wrqAlwaysConfirm:
1253 if(exists) 1261 if(exists)
1254 m_bResume=TRUE; 1262 m_bResume=TRUE;
1255 if(ConfirmRequest()){ 1263 if(ConfirmRequest()){
1256 if(m_Rename){ 1264 if(m_Rename){
1257 RenameFile(fn); 1265 RenameFile(fn);
1258 if(SaveAs(fn)) 1266 if(SaveAs(fn))
1259 break; 1267 break;
1260 }else 1268 }else
1261 break; 1269 break;
1262 } 1270 }
1263 case CPumpKINDlg::wrqDenyAll: 1271 case CPumpKINDlg::wrqDenyAll:
1264 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS); 1272 Deny(tftp::errAccessViolation,IDS_TFTP_ERROR_ACCESS);
1265 return TRUE; 1273 return TRUE;
1266 } 1274 }
1267 } 1275 }
1268CFileException e; 1276CFileException e;
1269 if(!m_File.Open( 1277 if(!m_File.Open(
1270 fn, 1278 fn,
1271 m_bResume 1279 m_bResume
1272 ?(CFile::modeWrite|CFile::shareDenyWrite) 1280 ?(CFile::modeWrite|CFile::shareDenyWrite)
1273 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite), 1281 :(CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite),
1274 &e 1282 &e
1275 )){ 1283 )){
1276 if(localFile){// Outgoing request 1284 if(localFile){// Outgoing request
1277 CString tmp; 1285 CString tmp;
1278 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn); 1286 tmp.Format(IDS_LOG_FAILEDTOOPEN,fn);
1279 m_Daddy->LogLine(tmp); 1287 m_Daddy->LogLine(tmp);
1280 return FALSE; 1288 return FALSE;
1281 }else{ 1289 }else{
1282 Deny(&e); 1290 Deny(&e);
1283 return TRUE; 1291 return TRUE;
1284 } 1292 }
1285 } 1293 }
1286 if(hostName){ 1294 if(hostName){
1287 m_HostName=hostName; 1295 m_HostName=hostName;
1288 1296
1289 CString tmp; 1297 CString tmp;
1290 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName); 1298 tmp.Format(IDS_LOG_REQUESTING,m_FileName,m_HostName);
1291 m_Daddy->LogLine(tmp); 1299 m_Daddy->LogLine(tmp);
1292 1300
1293 CString inAddr = hostName; 1301 CString inAddr = hostName;
1294 int at = inAddr.Find('@'); 1302 int at = inAddr.Find('@');
1295 if(at>=0) 1303 if(at>=0)
1296 inAddr=inAddr.Mid(at+1); 1304 inAddr=inAddr.Mid(at+1);
1297 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ 1305 if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){
1298 ASSERT(!m_wndResolver); 1306 ASSERT(!m_wndResolver);
1299 m_wndResolver = new CResolver(this); 1307 m_wndResolver = new CResolver(this);
1300 ASSERT(m_wndResolver); 1308 ASSERT(m_wndResolver);
1301 return m_wndResolver->Resolve(); 1309 return m_wndResolver->Resolve();
1302 }else{ 1310 }else{
1303 OnHostKnown(); 1311 OnHostKnown();
1304 return TRUE; 1312 return TRUE;
1305 } 1313 }
1306 } 1314 }
1307CString v; 1315CString v;
1308tftp::tftpOptions oack; 1316tftp::tftpOptions oack;
1309 if(m_Options.Lookup(tftpoTSize,v)){ 1317 if(m_Options.Lookup(tftpoTSize,v)){
1310 m_xferSize=atol(v); 1318 m_xferSize=atol(v);
1311 if(!m_xferSize){ 1319 if(!m_xferSize){
1312 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); 1320 Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE);
1313 return TRUE; 1321 return TRUE;
1314 } 1322 }
1315 } 1323 }
1316 if(m_Options.Lookup(tftpoBSize,v)){ 1324 if(m_Options.Lookup(tftpoBSize,v)){
1317 m_blkSize=atoi(v); 1325 m_blkSize=atoi(v);
1318 if(!m_blkSize){// *** Do more about sanity check 1326 if(!m_blkSize){// *** Do more about sanity check
1319 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 1327 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
1320 return TRUE; 1328 return TRUE;
1321 } 1329 }
1322 v.Format("%u",m_blkSize); 1330 v.Format("%u",m_blkSize);
1323 oack[tftpoBSize]=v; 1331 oack[tftpoBSize]=v;
1324 } 1332 }
1325 if(m_Options.Lookup(tftpoTOut,v)){ 1333 if(m_Options.Lookup(tftpoTOut,v)){
1326 m_timeOut=atoi(v); 1334 m_timeOut=atoi(v);
1327 if(!m_timeOut){// *** Do more about sanity check 1335 if(!m_timeOut){// *** Do more about sanity check
1328 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); 1336 Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT);
1329 return TRUE; 1337 return TRUE;
1330 } 1338 }
1331 v.Format("%u",m_timeOut); 1339 v.Format("%u",m_timeOut);
1332 oack[tftpoTOut]=v; 1340 oack[tftpoTOut]=v;
1333 } 1341 }
1334 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ 1342 if(m_Options.Lookup(tftpoXResume,v) && m_bResume){
1335 m_ACK=m_File.GetLength()/m_blkSize; 1343 m_ACK=m_File.GetLength()/m_blkSize;
1336 v.Format("%u",m_ACK); 1344 v.Format("%u",m_ACK);
1337 oack[tftpoXResume]=v; 1345 oack[tftpoXResume]=v;
1338 }else 1346 }else
1339 m_ACK=0; 1347 m_ACK=0;
1340 state=stateXfer; 1348 state=stateXfer;
1341 if(oack.GetCount()){ 1349 if(oack.GetCount()){
1342 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); 1350 tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack));
1343 ASSERT(p); 1351 ASSERT(p);
1344 p->SetOpcode(tftp::opOACK); 1352 p->SetOpcode(tftp::opOACK);
1345 p->data.m_OACK.Set(&oack); 1353 p->data.m_OACK.Set(&oack);
1346 PostTFTP(p,TRUE); 1354 PostTFTP(p,TRUE);
1347 }else 1355 }else
1348 DoXfer(); 1356 DoXfer();
1349 return TRUE; 1357 return TRUE;
1350} 1358}
1351 1359
1352BOOL CWRQSocket::ConfirmRequest() 1360BOOL CWRQSocket::ConfirmRequest()
1353{ 1361{
1354CConfirmWRQDlg cd(NULL); 1362CConfirmWRQDlg cd(NULL);
1355 cd.m_Daddy=this; 1363 cd.m_Daddy=this;
1356 cd.m_File=m_FileName; 1364 cd.m_File=m_FileName;
1357 cd.m_Host=inet_ntoa(m_Peer.sin_addr); 1365 cd.m_Host=inet_ntoa(m_Peer.sin_addr);
1358 switch(cd.DoModal()){ 1366 switch(cd.DoModal()){
1359 case IDOK: 1367 case IDOK:
1360 m_Rename=FALSE; 1368 m_Rename=FALSE;
1361 m_bResume=FALSE; 1369 m_bResume=FALSE;
1362 return TRUE; 1370 return TRUE;
1363 case IDC_RENAME: 1371 case IDC_RENAME:
1364 m_bResume=FALSE; 1372 m_bResume=FALSE;
1365 m_Rename=TRUE; 1373 m_Rename=TRUE;
1366 return TRUE; 1374 return TRUE;
1367 case IDC_RESUME: 1375 case IDC_RESUME:
1368 m_Rename=FALSE; 1376 m_Rename=FALSE;
1369 m_bResume=TRUE; 1377 m_bResume=TRUE;
1370 return TRUE; 1378 return TRUE;
1371 case IDCANCEL: 1379 case IDCANCEL:
1372 return FALSE; 1380 return FALSE;
1373 } 1381 }
1374 return FALSE; 1382 return FALSE;
1375} 1383}
1376 1384
1377BOOL CWRQSocket::RenameFile(CString& fn) 1385BOOL CWRQSocket::RenameFile(CString& fn)
1378{ 1386{
1379CString renamed = fn; 1387CString renamed = fn;
1380 if(fn.IsEmpty()) 1388 if(fn.IsEmpty())
1381 return FALSE; 1389 return FALSE;
1382 if(fn[fn.GetLength()-1]==')'){ 1390 if(fn[fn.GetLength()-1]==')'){
1383 int op = fn.ReverseFind('('); 1391 int op = fn.ReverseFind('(');
1384 if(op>0 && fn[op-1]==' '){ 1392 if(op>0 && fn[op-1]==' '){
1385 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) 1393 if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty())
1386 renamed = renamed.Left(op-1); 1394 renamed = renamed.Left(op-1);
1387 } 1395 }
1388 } 1396 }
1389CString testFN; 1397CString testFN;
1390 for(UINT tmp=0;tmp<32768;tmp++){ 1398 for(UINT tmp=0;tmp<32768;tmp++){
1391 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp); 1399 testFN.Format("%s (%u)",(LPCTSTR)renamed,tmp);
1392 if(!_access((LPCTSTR)testFN,0)) 1400 if(!_access((LPCTSTR)testFN,0))
1393 continue; 1401 continue;
1394 fn=testFN; 1402 fn=testFN;
1395 return TRUE; 1403 return TRUE;
1396 } 1404 }
1397 return FALSE; 1405 return FALSE;
1398} 1406}
1399 1407
1400BOOL CWRQSocket::SaveAs(CString& fn) 1408BOOL CWRQSocket::SaveAs(CString& fn)
1401{ 1409{
1402CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy); 1410CFileDialog cfd(FALSE,NULL,fn,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST,NULL,m_Daddy);
1403CString title; 1411CString title;
1404 title.LoadString(IDS_RENAME_TITLE); 1412 title.LoadString(IDS_RENAME_TITLE);
1405 cfd.m_ofn.lpstrTitle=(LPCTSTR)title; 1413 cfd.m_ofn.lpstrTitle=(LPCTSTR)title;
1406 if(cfd.DoModal()!=IDOK) 1414 if(cfd.DoModal()!=IDOK)
1407 return FALSE; 1415 return FALSE;
1408 fn = cfd.GetPathName(); 1416 fn = cfd.GetPathName();
1409 return TRUE; 1417 return TRUE;
1410} 1418}
1411 1419
1412void CWRQSocket::DoXfer() 1420void CWRQSocket::DoXfer()
1413{ 1421{
1414tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize()); 1422tftp *p = tftp::Allocate(tftp::tftpACK::tftpSize());
1415 ASSERT(p); 1423 ASSERT(p);
1416 p->SetOpcode(tftp::opACK); 1424 p->SetOpcode(tftp::opACK);
1417 p->data.m_ACK.SetBlock(m_ACK); 1425 p->data.m_ACK.SetBlock(m_ACK);
1418 TRACE1("WRQ-ACK-%u\n",m_ACK); 1426 TRACE1("WRQ-ACK-%u\n",m_ACK);
1419 PostTFTP(p,TRUE);// *** ??? Hope this is right 1427 PostTFTP(p,TRUE);// *** ??? Hope this is right
1420} 1428}
1421 1429
1422UINT tftp::tftpACK::tftpSize() 1430UINT tftp::tftpACK::tftpSize()
1423{ 1431{
1424 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK); 1432 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpACK);
1425} 1433}
1426 1434
1427ULONG CWRQSocket::GetACK() 1435ULONG CWRQSocket::GetACK()
1428{ 1436{
1429 return (m_ACK*m_blkSize)-m_LastSlack; 1437 return (m_ACK*m_blkSize)-m_LastSlack;
1430} 1438}
1431 1439
1432void CXferSocket::ResetTimeout() 1440void CXferSocket::ResetTimeout()
1433{ 1441{
1434 ASSERT(m_Daddy); 1442 ASSERT(m_Daddy);
1435 m_Daddy->m_Retrier->KillTimer(m_hSocket); 1443 m_Daddy->m_Retrier->KillTimer(m_hSocket);
1436 if(m_Retry) 1444 if(m_Retry)
1437 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL); 1445 m_Daddy->m_Retrier->SetTimer(m_hSocket,min(60,m_Daddy->m_RetryTimeOut.GetTotalSeconds())*1000,NULL);
1438 if(!m_bRetry){ 1446 if(!m_bRetry){
1439 m_Daddy->KillTimer(m_hSocket); 1447 m_Daddy->KillTimer(m_hSocket);
1440 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL); 1448 m_Daddy->SetTimer(m_hSocket,min(60,m_timeOut)*1000,NULL);
1441 } 1449 }
1442} 1450}
1443 1451
1444void CXferSocket::Abort() 1452void CXferSocket::Abort()
1445{ 1453{
1446 ASSERT(m_Daddy); 1454 ASSERT(m_Daddy);
1447CString tmp; 1455CString tmp;
1448 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName); 1456 tmp.Format(IDS_LOG_XFERABORTED,(LPCTSTR)m_FileName);
1449 m_Daddy->LogLine(tmp); 1457 m_Daddy->LogLine(tmp);
1450 Destroy(FALSE); 1458 Destroy(FALSE);
1451} 1459}
1452 1460
1453void CPumpKINDlg::OnTimer(UINT nIDEvent) 1461void CPumpKINDlg::OnTimer(UINT nIDEvent)
1454{ 1462{
1455CXferSocket *socket; 1463CXferSocket *socket;
1456 if(m_Xfers.Lookup(nIDEvent,socket)){ 1464 if(m_Xfers.Lookup(nIDEvent,socket)){
1457 CString tmp; 1465 CString tmp;
1458 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName); 1466 tmp.Format(IDS_LOG_TIMEDOUT,socket->m_FileName);
1459 LogLine(tmp); 1467 LogLine(tmp);
1460 socket->Abort(); 1468 socket->Abort();
1461 }else{ 1469 }else{
1462 TRACE0("Failed to find timed out socket!\n"); 1470 TRACE0("Failed to find timed out socket!\n");
1463 } 1471 }
1464 CDialog::OnTimer(nIDEvent); 1472 CDialog::OnTimer(nIDEvent);
1465} 1473}
1466 1474
1467void CPumpKINDlg::OnExit() 1475void CPumpKINDlg::OnExit()
1468{ 1476{
1469 if(!m_Xfers.IsEmpty()){ 1477 if(!m_Xfers.IsEmpty()){
1470 CString title,text; 1478 CString title,text;
1471 title.LoadString(IDS_CONFIRMEXIT_TITLE); 1479 title.LoadString(IDS_CONFIRMEXIT_TITLE);
1472 text.LoadString(IDS_CONFIRMEXIT_TEXT); 1480 text.LoadString(IDS_CONFIRMEXIT_TEXT);
1473 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES) 1481 if(MessageBox(text,title,MB_ICONQUESTION|MB_YESNO)!=IDYES)
1474 return; 1482 return;
1475 } 1483 }
1476 m_bExiting=TRUE; 1484 m_bExiting=TRUE;
1477 EndDialog(IDOK); 1485 EndDialog(IDOK);
1478} 1486}
1479 1487
1480void CPumpKINDlg::OnPut() 1488void CPumpKINDlg::OnPut()
1481{ 1489{
1482CRequestDlg crd(NULL); 1490CRequestDlg crd(NULL);
1483 crd.m_Put=TRUE; 1491 crd.m_Put=TRUE;
1484 crd.m_BSize=m_BlockSize; 1492 crd.m_BSize=m_BlockSize;
1485 if(crd.DoModal()==IDOK){ 1493 if(crd.DoModal()==IDOK){
1486 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1494 CRRQSocket *socket = new CRRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1487 if(crd.m_BSize) 1495 if(crd.m_BSize)
1488 socket->m__blkSize=crd.m_BSize; 1496 socket->m__blkSize=crd.m_BSize;
1489 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1497 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1490 socket->Destroy(); 1498 socket->Destroy();
1491 } 1499 }
1492} 1500}
1493 1501
1494void CPumpKINDlg::OnGet() 1502void CPumpKINDlg::OnGet()
1495{ 1503{
1496CRequestDlg crd(NULL); 1504CRequestDlg crd(NULL);
1497 crd.m_Put=FALSE; 1505 crd.m_Put=FALSE;
1498 crd.m_BSize=m_BlockSize; 1506 crd.m_BSize=m_BlockSize;
1499 if(crd.DoModal()==IDOK){ 1507 if(crd.DoModal()==IDOK){
1500 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL); 1508 CWRQSocket *socket = new CWRQSocket(this,crd.m_RemoteFile,crd.m_Type,NULL);
1501 if(crd.m_BSize) 1509 if(crd.m_BSize)
1502 socket->m__blkSize=crd.m_BSize; 1510 socket->m__blkSize=crd.m_BSize;
1503 if(!socket->Create(crd.m_LocalFile,crd.m_Host)) 1511 if(!socket->Create(crd.m_LocalFile,crd.m_Host))
1504 socket->Destroy(); 1512 socket->Destroy();
1505 } 1513 }
1506} 1514}
1507 1515
1508void CPumpKINDlg::SetupButtons() 1516void CPumpKINDlg::SetupButtons()
1509{ 1517{
1510 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0); 1518 m_AbortCtl.EnableWindow(m_List.GetSelectedCount()>0);
1511} 1519}
1512 1520
1513void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult) 1521void CPumpKINDlg::OnDeleteallitemsConnections(NMHDR* pNMHDR, LRESULT* pResult)
1514{ 1522{
1515 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1523 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1516 SetupButtons(); 1524 SetupButtons();
1517 *pResult = 0; 1525 *pResult = 0;
1518} 1526}
1519 1527
1520void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1528void CPumpKINDlg::OnDeleteitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1521{ 1529{
1522 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1530 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1523 SetupButtons(); 1531 SetupButtons();
1524 *pResult = 0; 1532 *pResult = 0;
1525} 1533}
1526 1534
1527void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult) 1535void CPumpKINDlg::OnInsertitemConnections(NMHDR* pNMHDR, LRESULT* pResult)
1528{ 1536{
1529 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1537 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1530 SetupButtons(); 1538 SetupButtons();
1531 *pResult = 0; 1539 *pResult = 0;
1532} 1540}
1533 1541
1534void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult) 1542void CPumpKINDlg::OnItemchangedConnections(NMHDR* pNMHDR, LRESULT* pResult)
1535{ 1543{
1536 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 1544 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
1537 SetupButtons(); 1545 SetupButtons();
1538 *pResult = 0; 1546 *pResult = 0;