summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
Unidiff
Diffstat (limited to 'PumpKINDlg.cpp') (more/less context) (show whitespace changes)
-rw-r--r--PumpKINDlg.cpp22
1 files changed, 13 insertions, 9 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp
index 070f3e8..2a01918 100644
--- a/PumpKINDlg.cpp
+++ b/PumpKINDlg.cpp
@@ -570,28 +570,28 @@ void CXferSocket::OnSend(int nErrorCode)
570 } 570 }
571} 571}
572 572
573BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr) 573BOOL tftp::Send(CAsyncSocket *socket,SOCKADDR_IN* saddr)
574{ 574{
575 ASSERT(socket); 575 ASSERT(socket);
576int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN)); 576int rv = socket->SendTo(udpBase(),length,(SOCKADDR*)saddr,sizeof(SOCKADDR_IN));
577 if(rv!=length) 577 if(rv!=length)
578 return FALSE; 578 return FALSE;
579 return TRUE; 579 return TRUE;
580} 580}
581 581
582void CXferSocket::DoSelect() 582void CXferSocket::DoSelect(BOOL do_select)
583{ 583{
584 if(m_Peer.sin_addr.s_addr!=INADDR_NONE) 584 if(m_Peer.sin_addr.s_addr!=INADDR_NONE)
585 AsyncSelect(FD_CLOSE|FD_READ|(m_Queue.IsEmpty()?0:FD_WRITE)); 585 AsyncSelect(FD_CLOSE|FD_READ|((m_Queue.IsEmpty()&&!do_select)?0:FD_WRITE));
586} 586}
587 587
588void CXferSocket::OnReceive(int nErrorCode) 588void CXferSocket::OnReceive(int nErrorCode)
589{ 589{
590 if(nErrorCode){ 590 if(nErrorCode){
591 ASSERT(m_Daddy); 591 ASSERT(m_Daddy);
592 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE); 592 m_Daddy->LogLine(IDS_LOG_XFERRECEIVE);
593 return; 593 return;
594 } 594 }
595 ASSERT(m_Daddy); 595 ASSERT(m_Daddy);
596DWORD fionread = 0; 596DWORD fionread = 0;
597 VERIFY(IOCtl(FIONREAD,&fionread)); 597 VERIFY(IOCtl(FIONREAD,&fionread));
@@ -845,29 +845,25 @@ void CRRQSocket::DoXfer()
845{ 845{
846tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize)); 846tftp *p = tftp::Allocate(tftp::tftpDATA::tftpSize(m_blkSize));
847 ASSERT(p); 847 ASSERT(p);
848 p->SetOpcode(tftp::opDATA); 848 p->SetOpcode(tftp::opDATA);
849 TRY{ 849 TRY{
850 m_File.Seek(m_ACK*m_blkSize,CFile::begin); 850 m_File.Seek(m_ACK*m_blkSize,CFile::begin);
851 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize); 851 int bytes = m_File.Read(p->data.m_DATA.data,m_blkSize);
852 p->data.m_DATA.SetBlock(m_ACK+1); 852 p->data.m_DATA.SetBlock(m_ACK+1);
853 p->length=p->length-m_blkSize+bytes; 853 p->length=p->length-m_blkSize+bytes;
854 m_LastSlack = m_blkSize-bytes; 854 m_LastSlack = m_blkSize-bytes;
855 PostTFTP(p); 855 PostTFTP(p);
856 if(bytes<m_blkSize){ 856 if(bytes<m_blkSize){
857 state=stateFinish; 857 state=stateClosing; m_ACKtoClose = m_ACK+1;
858 ASSERT(m_Daddy);
859 CString tmp;
860 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
861 m_Daddy->LogLine(tmp);
862 } 858 }
863 }CATCH(CFileException,e){ 859 }CATCH(CFileException,e){
864 Deny(e); 860 Deny(e);
865 }END_CATCH 861 }END_CATCH
866} 862}
867 863
868UINT tftp::tftpDATA::tftpSize(UINT blkSize) 864UINT tftp::tftpDATA::tftpSize(UINT blkSize)
869{ 865{
870 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA) 866 return tftpHdrSize-tftpSlackSize+sizeof(tftp::tftpDATA)
871 -sizeof(BYTE)+blkSize; 867 -sizeof(BYTE)+blkSize;
872} 868}
873 869
@@ -927,27 +923,27 @@ UINT eMsgID;
927} 923}
928 924
929ULONG CRRQSocket::GetACK(void) 925ULONG CRRQSocket::GetACK(void)
930{ 926{
931 return (m_ACK*m_blkSize)-m_LastSlack; 927 return (m_ACK*m_blkSize)-m_LastSlack;
932} 928}
933 929
934BOOL CRRQSocket::OnTFTP(tftp* p) 930BOOL CRRQSocket::OnTFTP(tftp* p)
935{ 931{
936BOOL rv = TRUE; 932BOOL rv = TRUE;
937 switch(p->Opcode()){ 933 switch(p->Opcode()){
938 case tftp::opOACK: 934 case tftp::opOACK:
935 {
939 m_ACK=0; 936 m_ACK=0;
940 ASSERT(state!=stateFinish); 937 ASSERT(state!=stateFinish);
941 {
942 tftp::tftpOptions o; 938 tftp::tftpOptions o;
943 if(p->GetOptions(&o)){ 939 if(p->GetOptions(&o)){
944 CString v; 940 CString v;
945 if(o.Lookup(tftpoBSize,v)){ 941 if(o.Lookup(tftpoBSize,v)){
946 m_blkSize=atoi(v); 942 m_blkSize=atoi(v);
947 if(!m_blkSize){// *** More sanity checks 943 if(!m_blkSize){// *** More sanity checks
948 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); 944 Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE);
949 rv = TRUE; 945 rv = TRUE;
950 break; 946 break;
951 } 947 }
952 } 948 }
953 if(o.Lookup(tftpoTOut,v)){ 949 if(o.Lookup(tftpoTOut,v)){
@@ -959,25 +955,33 @@ BOOL rv = TRUE;
959 } 955 }
960 } 956 }
961 if(o.Lookup(tftpoXResume,v)){ 957 if(o.Lookup(tftpoXResume,v)){
962 m_ACK=atoi(v); 958 m_ACK=atoi(v);
963 } 959 }
964 } 960 }
965 UpdateList(); 961 UpdateList();
966 DoXfer(); 962 DoXfer();
967 } 963 }
968 break; 964 break;
969 case tftp::opACK: 965 case tftp::opACK:
970 m_ACK=p->data.m_ACK.Block(); 966 m_ACK=p->data.m_ACK.Block();
971 if(state!=stateFinish){ 967 if(state==stateClosing && m_ACK==m_ACKtoClose) {
968 state = stateFinish;
969 ASSERT(m_Daddy);
970 CString tmp;
971 tmp.Format(IDS_LOG_XFERRRQFINISHED,(LPCTSTR)m_FileName);
972 m_Daddy->LogLine(tmp);
973 rv = FALSE;
974 DoSelect(TRUE);
975 }else if(state!=stateFinish){
972 UpdateList(); 976 UpdateList();
973 DoXfer(); 977 DoXfer();
974 } 978 }
975 break; 979 break;
976 case tftp::opERROR: 980 case tftp::opERROR:
977 { 981 {
978 ASSERT(m_Daddy); 982 ASSERT(m_Daddy);
979 CString tmp; 983 CString tmp;
980 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); 984 tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage());
981 m_Daddy->LogLine(tmp); 985 m_Daddy->LogLine(tmp);
982 } 986 }
983 Destroy(FALSE); 987 Destroy(FALSE);