summaryrefslogtreecommitdiffabout
path: root/PumpKINDlg.cpp
authorMichael Krelin <hacker@klever.net>2004-09-12 11:46:21 (UTC)
committer Michael Krelin <hacker@klever.net>2004-09-12 11:46:21 (UTC)
commit4435ed85c3acb4df42135e009b133fb8e9d2f09c (patch) (unidiff)
treec1f4b4da029153459465d3679acdf48c594943ae /PumpKINDlg.cpp
parent9bd9ea789778ff25ba61a22bca0eacc14ae47cb7 (diff)
downloadpumpkin-4435ed85c3acb4df42135e009b133fb8e9d2f09c.zip
pumpkin-4435ed85c3acb4df42135e009b133fb8e9d2f09c.tar.gz
pumpkin-4435ed85c3acb4df42135e009b133fb8e9d2f09c.tar.bz2
quick fix to the backslash conversion problem.
git-svn-id: http://svn.klever.net/kin/pumpkin/trunk@46 fe716a7a-6dde-0310-88d9-d003556173a8
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
@@ -709,1027 +709,1031 @@ CFileException e;
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}