-rw-r--r-- | PumpKINDlg.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/PumpKINDlg.cpp b/PumpKINDlg.cpp index bb15211..f41b69f 100644 --- a/PumpKINDlg.cpp +++ b/PumpKINDlg.cpp | |||
@@ -51,97 +51,97 @@ public: | |||
51 | // Implementation | 51 | // Implementation |
52 | protected: | 52 | protected: |
53 | //{{AFX_MSG(CAboutDlg) | 53 | //{{AFX_MSG(CAboutDlg) |
54 | afx_msg void OnKlevernet(); | 54 | afx_msg void OnKlevernet(); |
55 | //}}AFX_MSG | 55 | //}}AFX_MSG |
56 | DECLARE_MESSAGE_MAP() | 56 | DECLARE_MESSAGE_MAP() |
57 | }; | 57 | }; |
58 | 58 | ||
59 | CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) | 59 | CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) |
60 | { | 60 | { |
61 | //{{AFX_DATA_INIT(CAboutDlg) | 61 | //{{AFX_DATA_INIT(CAboutDlg) |
62 | //}}AFX_DATA_INIT | 62 | //}}AFX_DATA_INIT |
63 | } | 63 | } |
64 | 64 | ||
65 | void CAboutDlg::DoDataExchange(CDataExchange* pDX) | 65 | void CAboutDlg::DoDataExchange(CDataExchange* pDX) |
66 | { | 66 | { |
67 | CDialog::DoDataExchange(pDX); | 67 | CDialog::DoDataExchange(pDX); |
68 | //{{AFX_DATA_MAP(CAboutDlg) | 68 | //{{AFX_DATA_MAP(CAboutDlg) |
69 | //}}AFX_DATA_MAP | 69 | //}}AFX_DATA_MAP |
70 | } | 70 | } |
71 | 71 | ||
72 | BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) | 72 | BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) |
73 | //{{AFX_MSG_MAP(CAboutDlg) | 73 | //{{AFX_MSG_MAP(CAboutDlg) |
74 | ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) | 74 | ON_BN_CLICKED(IDC_KLEVERNET, OnKlevernet) |
75 | //}}AFX_MSG_MAP | 75 | //}}AFX_MSG_MAP |
76 | END_MESSAGE_MAP() | 76 | END_MESSAGE_MAP() |
77 | 77 | ||
78 | ///////////////////////////////////////////////////////////////////////////// | 78 | ///////////////////////////////////////////////////////////////////////////// |
79 | // CPumpKINDlg dialog | 79 | // CPumpKINDlg dialog |
80 | 80 | ||
81 | CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) | 81 | CPumpKINDlg::CPumpKINDlg(CWnd* pParent /*=NULL*/) |
82 | : CDialog(CPumpKINDlg::IDD, pParent), m_MinSize(0,0) | 82 | : CDialog(CPumpKINDlg::IDD, pParent), m_MinSize(0,0) |
83 | { | 83 | { |
84 | m_Listener.m_Daddy = this; | 84 | m_Listener.m_Daddy = this; |
85 | 85 | ||
86 | m_bListen = TRUE; | 86 | m_bListen = TRUE; |
87 | 87 | ||
88 | m_ListenPort = 69; | 88 | m_ListenPort = 69; |
89 | m_bTFTPSubdirs = TRUE; | 89 | m_bTFTPSubdirs = TRUE; |
90 | m_RRQMode = rrqAlwaysConfirm; | 90 | m_RRQMode = rrqAlwaysConfirm; |
91 | m_WRQMode = wrqAlwaysConfirm; | 91 | m_WRQMode = wrqAlwaysConfirm; |
92 | m_TFTPTimeOut = CTimeSpan(0,0,0,30); | 92 | m_TFTPTimeOut = CTimeSpan(0,0,0,30); |
93 | m_RetryTimeOut = CTimeSpan(0,0,0,10); | 93 | m_RetryTimeOut = CTimeSpan(0,0,0,10); |
94 | m_LogLength = 100; | 94 | m_LogLength = 100; |
95 | m_SpeakPort = 69; | 95 | m_SpeakPort = 69; |
96 | m_PromptTimeOut=30; | 96 | m_PromptTimeOut=30; |
97 | m_bShown=TRUE; | 97 | m_bShown=TRUE; |
98 | m_bExiting=FALSE; | 98 | m_bExiting=FALSE; |
99 | m_BlockSize=1024; | 99 | m_BlockSize=2048; |
100 | m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); | 100 | m_bnw.AssignSound("(bang)",IDR_WAVE_RING,CBellsNWhistles::CBang::bangResource); |
101 | m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); | 101 | m_bnw.AssignSound("(done)",IDR_WAVE_FINISHED,CBellsNWhistles::CBang::bangResource); |
102 | m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); | 102 | m_bnw.AssignSound("(oops)",IDR_WAVE_ABORTED,CBellsNWhistles::CBang::bangResource); |
103 | m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); | 103 | m_bnw.AssignSound("(none)",(int)0,CBellsNWhistles::CBang::bangNone); |
104 | m_bnwRequest="(bang)"; m_bnwSuccess="(done)"; | 104 | m_bnwRequest="(bang)"; m_bnwSuccess="(done)"; |
105 | m_bnwAbort="(oops)"; | 105 | m_bnwAbort="(oops)"; |
106 | //{{AFX_DATA_INIT(CPumpKINDlg) | 106 | //{{AFX_DATA_INIT(CPumpKINDlg) |
107 | //}}AFX_DATA_INIT | 107 | //}}AFX_DATA_INIT |
108 | // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 | 108 | // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 |
109 | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); | 109 | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
110 | m_bmpBack.LoadBitmap(IDB_BACKGROUND); | 110 | m_bmpBack.LoadBitmap(IDB_BACKGROUND); |
111 | m_bmpBack.GetBitmap(&m_bitmapBack); | 111 | m_bmpBack.GetBitmap(&m_bitmapBack); |
112 | m_Retrier = new CRetrier(this); | 112 | m_Retrier = new CRetrier(this); |
113 | ASSERT(m_Retrier); | 113 | ASSERT(m_Retrier); |
114 | m_Trayer = new CTrayer(this); | 114 | m_Trayer = new CTrayer(this); |
115 | ASSERT(m_Trayer); | 115 | ASSERT(m_Trayer); |
116 | /* Ensure we're backwards compatible */ | 116 | /* Ensure we're backwards compatible */ |
117 | ASSERT(CPumpKINDlg::rrqGiveAll==0); | 117 | ASSERT(CPumpKINDlg::rrqGiveAll==0); |
118 | ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1); | 118 | ASSERT(CPumpKINDlg::rrqAlwaysConfirm==1); |
119 | ASSERT(CPumpKINDlg::rrqDenyAll==2); | 119 | ASSERT(CPumpKINDlg::rrqDenyAll==2); |
120 | ASSERT(CPumpKINDlg::wrqTakeAll==0); | 120 | ASSERT(CPumpKINDlg::wrqTakeAll==0); |
121 | ASSERT(CPumpKINDlg::wrqConfirmIfExists==1); | 121 | ASSERT(CPumpKINDlg::wrqConfirmIfExists==1); |
122 | ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2); | 122 | ASSERT(CPumpKINDlg::wrqAlwaysConfirm==2); |
123 | ASSERT(CPumpKINDlg::wrqDenyAll==3); | 123 | ASSERT(CPumpKINDlg::wrqDenyAll==3); |
124 | /* -- */ | 124 | /* -- */ |
125 | LoadSettings(); | 125 | LoadSettings(); |
126 | } | 126 | } |
127 | 127 | ||
128 | void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) | 128 | void CPumpKINDlg::DoDataExchange(CDataExchange* pDX) |
129 | { | 129 | { |
130 | CDialog::DoDataExchange(pDX); | 130 | CDialog::DoDataExchange(pDX); |
131 | //{{AFX_DATA_MAP(CPumpKINDlg) | 131 | //{{AFX_DATA_MAP(CPumpKINDlg) |
132 | DDX_Control(pDX, ID_HELP, m_HelpCtl); | 132 | DDX_Control(pDX, ID_HELP, m_HelpCtl); |
133 | DDX_Control(pDX, IDC_PUT, m_PutCtl); | 133 | DDX_Control(pDX, IDC_PUT, m_PutCtl); |
134 | DDX_Control(pDX, IDC_GET, m_GetCtl); | 134 | DDX_Control(pDX, IDC_GET, m_GetCtl); |
135 | DDX_Control(pDX, IDC_EXIT, m_ExitCtl); | 135 | DDX_Control(pDX, IDC_EXIT, m_ExitCtl); |
136 | DDX_Control(pDX, IDC_LISTENING, m_ListenCtl); | 136 | DDX_Control(pDX, IDC_LISTENING, m_ListenCtl); |
137 | DDX_Control(pDX, IDC_ABORT, m_AbortCtl); | 137 | DDX_Control(pDX, IDC_ABORT, m_AbortCtl); |
138 | DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); | 138 | DDX_Control(pDX, IDC_OPTIONS, m_OptionsCtl); |
139 | DDX_Control(pDX, IDC_LOG, m_Log); | 139 | DDX_Control(pDX, IDC_LOG, m_Log); |
140 | DDX_Control(pDX, IDC_CONNECTIONS, m_List); | 140 | DDX_Control(pDX, IDC_CONNECTIONS, m_List); |
141 | //}}AFX_DATA_MAP | 141 | //}}AFX_DATA_MAP |
142 | } | 142 | } |
143 | 143 | ||
144 | BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) | 144 | BEGIN_MESSAGE_MAP(CPumpKINDlg, CDialog) |
145 | //{{AFX_MSG_MAP(CPumpKINDlg) | 145 | //{{AFX_MSG_MAP(CPumpKINDlg) |
146 | ON_WM_SYSCOMMAND() | 146 | ON_WM_SYSCOMMAND() |
147 | ON_WM_DESTROY() | 147 | ON_WM_DESTROY() |
@@ -988,96 +988,100 @@ BOOL rv = TRUE; | |||
988 | m_Daddy->LogLine(tmp); | 988 | m_Daddy->LogLine(tmp); |
989 | } | 989 | } |
990 | Destroy(FALSE); | 990 | Destroy(FALSE); |
991 | rv = FALSE; | 991 | rv = FALSE; |
992 | break; | 992 | break; |
993 | default: | 993 | default: |
994 | { | 994 | { |
995 | ASSERT(m_Daddy); | 995 | ASSERT(m_Daddy); |
996 | CString tmp; | 996 | CString tmp; |
997 | tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); | 997 | tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); |
998 | m_Daddy->LogLine(tmp); | 998 | m_Daddy->LogLine(tmp); |
999 | // *** Self destruct maybe?? | 999 | // *** Self destruct maybe?? |
1000 | } | 1000 | } |
1001 | break; | 1001 | break; |
1002 | } | 1002 | } |
1003 | return rv; | 1003 | return rv; |
1004 | } | 1004 | } |
1005 | 1005 | ||
1006 | BOOL CWRQSocket::OnTFTP(tftp* p) | 1006 | BOOL CWRQSocket::OnTFTP(tftp* p) |
1007 | { | 1007 | { |
1008 | switch(p->Opcode()){ | 1008 | switch(p->Opcode()){ |
1009 | case tftp::opOACK: | 1009 | case tftp::opOACK: |
1010 | ASSERT(state!=stateFinish); | 1010 | ASSERT(state!=stateFinish); |
1011 | { | 1011 | { |
1012 | if(m_bResume) | 1012 | if(m_bResume) |
1013 | m_ACK=m_File.GetLength()/m_blkSize; | 1013 | m_ACK=m_File.GetLength()/m_blkSize; |
1014 | else | 1014 | else |
1015 | m_ACK=0; | 1015 | m_ACK=0; |
1016 | tftp::tftpOptions o; | 1016 | tftp::tftpOptions o; |
1017 | if(p->GetOptions(&o)){ | 1017 | if(p->GetOptions(&o)){ |
1018 | CString v; | 1018 | CString v; |
1019 | if(o.Lookup(tftpoBSize,v)){ | 1019 | if(o.Lookup(tftpoBSize,v)){ |
1020 | m_blkSize=atoi(v); | 1020 | m_blkSize=atoi(v); |
1021 | if(!m_blkSize){// *** More sanity checks | 1021 | if(!m_blkSize){// *** More sanity checks |
1022 | Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); | 1022 | Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); |
1023 | return TRUE; | 1023 | return TRUE; |
1024 | } | 1024 | } |
1025 | } | 1025 | } |
1026 | if(o.Lookup(tftpoTOut,v)){ | 1026 | if(o.Lookup(tftpoTOut,v)){ |
1027 | m_timeOut=atoi(v); | 1027 | m_timeOut=atoi(v); |
1028 | if(!m_timeOut){// *** More sanity checks | 1028 | if(!m_timeOut){// *** More sanity checks |
1029 | Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); | 1029 | Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); |
1030 | return TRUE; | 1030 | return TRUE; |
1031 | } | 1031 | } |
1032 | } | 1032 | } |
1033 | if(o.Lookup(tftpoTSize,v)){ | 1033 | if(o.Lookup(tftpoTSize,v)){ |
1034 | m_xferSize=atoi(v); | 1034 | m_xferSize=atoi(v); |
1035 | } | 1035 | } |
1036 | if(m_xferSize>=0 && m_xferSize>=(m_blkSize<<16)) { | ||
1037 | Deny(tftp::errUndefined,IDS_TFTP_ERROR_TOOBIG); | ||
1038 | return TRUE; | ||
1039 | } | ||
1036 | } | 1040 | } |
1037 | UpdateList(); | 1041 | UpdateList(); |
1038 | DoXfer(); | 1042 | DoXfer(); |
1039 | } | 1043 | } |
1040 | break; | 1044 | break; |
1041 | case tftp::opDATA: | 1045 | case tftp::opDATA: |
1042 | { | 1046 | { |
1043 | UINTblock = p->data.m_DATA.Block(); | 1047 | UINTblock = p->data.m_DATA.Block(); |
1044 | TRY{ | 1048 | TRY{ |
1045 | m_File.Seek((block-1)*m_blkSize,CFile::begin); | 1049 | m_File.Seek((block-1)*m_blkSize,CFile::begin); |
1046 | int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); | 1050 | int bytes = p->length-sizeof(p->data.m_DATA.block)-(tftpHdrSize-tftpSlackSize); |
1047 | if(bytes){ | 1051 | if(bytes){ |
1048 | m_File.Write(p->data.m_DATA.data,bytes); | 1052 | m_File.Write(p->data.m_DATA.data,bytes); |
1049 | // *** Move to the other place where we can do it not that often | 1053 | // *** Move to the other place where we can do it not that often |
1050 | m_File.SetLength(m_File.GetPosition()); | 1054 | m_File.SetLength(m_File.GetPosition()); |
1051 | } | 1055 | } |
1052 | if(bytes<m_blkSize){ | 1056 | if(bytes<m_blkSize){ |
1053 | state=stateFinish; | 1057 | state=stateFinish; |
1054 | ASSERT(m_Daddy); | 1058 | ASSERT(m_Daddy); |
1055 | CString tmp; | 1059 | CString tmp; |
1056 | tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); | 1060 | tmp.Format(IDS_LOG_XFERWRQFINISHED,(LPCTSTR)m_FileName); |
1057 | m_Daddy->LogLine(tmp); | 1061 | m_Daddy->LogLine(tmp); |
1058 | } | 1062 | } |
1059 | m_ACK=block; | 1063 | m_ACK=block; |
1060 | m_LastSlack=m_blkSize-bytes; | 1064 | m_LastSlack=m_blkSize-bytes; |
1061 | UpdateList(); | 1065 | UpdateList(); |
1062 | DoXfer(); | 1066 | DoXfer(); |
1063 | }CATCH(CFileException,e){ | 1067 | }CATCH(CFileException,e){ |
1064 | Deny(e); | 1068 | Deny(e); |
1065 | }END_CATCH | 1069 | }END_CATCH |
1066 | } | 1070 | } |
1067 | break; | 1071 | break; |
1068 | case tftp::opERROR: | 1072 | case tftp::opERROR: |
1069 | { | 1073 | { |
1070 | ASSERT(m_Daddy); | 1074 | ASSERT(m_Daddy); |
1071 | CString tmp; | 1075 | CString tmp; |
1072 | tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); | 1076 | tmp.Format(IDS_LOG_GOTTFTPERROR,p->data.m_ERROR.Code(),(LPCTSTR)p->errMessage()); |
1073 | m_Daddy->LogLine(tmp); | 1077 | m_Daddy->LogLine(tmp); |
1074 | } | 1078 | } |
1075 | Destroy(FALSE); | 1079 | Destroy(FALSE); |
1076 | return FALSE; | 1080 | return FALSE; |
1077 | default: | 1081 | default: |
1078 | { | 1082 | { |
1079 | ASSERT(m_Daddy); | 1083 | ASSERT(m_Daddy); |
1080 | CString tmp; | 1084 | CString tmp; |
1081 | tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); | 1085 | tmp.Format(IDS_LOG_XFEROPCODE,p->Opcode()); |
1082 | m_Daddy->LogLine(tmp); | 1086 | m_Daddy->LogLine(tmp); |
1083 | // *** Self destruct maybe?? | 1087 | // *** Self destruct maybe?? |
@@ -1364,96 +1368,101 @@ CFileException e; | |||
1364 | 1368 | ||
1365 | CString inAddr = hostName; | 1369 | CString inAddr = hostName; |
1366 | int at = inAddr.Find('@'); | 1370 | int at = inAddr.Find('@'); |
1367 | if(at>=0) | 1371 | if(at>=0) |
1368 | inAddr=inAddr.Mid(at+1); | 1372 | inAddr=inAddr.Mid(at+1); |
1369 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ | 1373 | if((m_Peer.sin_addr.s_addr=inet_addr((LPCTSTR)inAddr))==INADDR_NONE){ |
1370 | ASSERT(!m_wndResolver); | 1374 | ASSERT(!m_wndResolver); |
1371 | m_wndResolver = new CResolver(this); | 1375 | m_wndResolver = new CResolver(this); |
1372 | ASSERT(m_wndResolver); | 1376 | ASSERT(m_wndResolver); |
1373 | return m_wndResolver->Resolve(); | 1377 | return m_wndResolver->Resolve(); |
1374 | }else{ | 1378 | }else{ |
1375 | OnHostKnown(); | 1379 | OnHostKnown(); |
1376 | return TRUE; | 1380 | return TRUE; |
1377 | } | 1381 | } |
1378 | } | 1382 | } |
1379 | CString v; | 1383 | CString v; |
1380 | tftp::tftpOptions oack; | 1384 | tftp::tftpOptions oack; |
1381 | if(m_Options.Lookup(tftpoTSize,v)){ | 1385 | if(m_Options.Lookup(tftpoTSize,v)){ |
1382 | m_xferSize=atol(v); | 1386 | m_xferSize=atol(v); |
1383 | if(!m_xferSize){ | 1387 | if(!m_xferSize){ |
1384 | Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); | 1388 | Deny(tftp::errOption,IDS_TFTP_ERROR_TSIZE); |
1385 | return TRUE; | 1389 | return TRUE; |
1386 | } | 1390 | } |
1387 | } | 1391 | } |
1388 | if(m_Options.Lookup(tftpoBSize,v)){ | 1392 | if(m_Options.Lookup(tftpoBSize,v)){ |
1389 | m_blkSize=atoi(v); | 1393 | m_blkSize=atoi(v); |
1390 | if(!m_blkSize){// *** Do more about sanity check | 1394 | if(!m_blkSize){// *** Do more about sanity check |
1391 | Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); | 1395 | Deny(tftp::errOption,IDS_TFTP_ERROR_BSIZE); |
1392 | return TRUE; | 1396 | return TRUE; |
1393 | } | 1397 | } |
1394 | v.Format("%u",m_blkSize); | 1398 | v.Format("%u",m_blkSize); |
1395 | oack[tftpoBSize]=v; | 1399 | oack[tftpoBSize]=v; |
1396 | } | 1400 | } |
1397 | if(m_Options.Lookup(tftpoTOut,v)){ | 1401 | if(m_Options.Lookup(tftpoTOut,v)){ |
1398 | m_timeOut=atoi(v); | 1402 | m_timeOut=atoi(v); |
1399 | if(!m_timeOut){// *** Do more about sanity check | 1403 | if(!m_timeOut){// *** Do more about sanity check |
1400 | Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); | 1404 | Deny(tftp::errOption,IDS_TFTP_ERROR_TOUT); |
1401 | return TRUE; | 1405 | return TRUE; |
1402 | } | 1406 | } |
1403 | v.Format("%u",m_timeOut); | 1407 | v.Format("%u",m_timeOut); |
1404 | oack[tftpoTOut]=v; | 1408 | oack[tftpoTOut]=v; |
1405 | } | 1409 | } |
1406 | if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ | 1410 | if(m_Options.Lookup(tftpoXResume,v) && m_bResume){ |
1407 | m_ACK=m_File.GetLength()/m_blkSize; | 1411 | m_ACK=m_File.GetLength()/m_blkSize; |
1408 | v.Format("%u",m_ACK); | 1412 | v.Format("%u",m_ACK); |
1409 | oack[tftpoXResume]=v; | 1413 | oack[tftpoXResume]=v; |
1410 | }else | 1414 | }else |
1411 | m_ACK=0; | 1415 | m_ACK=0; |
1416 | // XXX: see if we can negotiate the right block size somehow | ||
1417 | if(m_xferSize>=0 && m_xferSize>=(m_blkSize<<16)) { | ||
1418 | Deny(tftp::errUndefined,IDS_TFTP_ERROR_TOOBIG); | ||
1419 | return TRUE; | ||
1420 | } | ||
1412 | state=stateXfer; | 1421 | state=stateXfer; |
1413 | if(oack.GetCount()){ | 1422 | if(oack.GetCount()){ |
1414 | tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); | 1423 | tftp *p = tftp::Allocate(tftp::tftpOACK::tftpSize(&oack)); |
1415 | ASSERT(p); | 1424 | ASSERT(p); |
1416 | p->SetOpcode(tftp::opOACK); | 1425 | p->SetOpcode(tftp::opOACK); |
1417 | p->data.m_OACK.Set(&oack); | 1426 | p->data.m_OACK.Set(&oack); |
1418 | PostTFTP(p,TRUE); | 1427 | PostTFTP(p,TRUE); |
1419 | }else | 1428 | }else |
1420 | DoXfer(); | 1429 | DoXfer(); |
1421 | return TRUE; | 1430 | return TRUE; |
1422 | } | 1431 | } |
1423 | 1432 | ||
1424 | BOOL CWRQSocket::ConfirmRequest() | 1433 | BOOL CWRQSocket::ConfirmRequest() |
1425 | { | 1434 | { |
1426 | CConfirmWRQDlg cd(NULL); | 1435 | CConfirmWRQDlg cd(NULL); |
1427 | cd.m_Daddy=this; | 1436 | cd.m_Daddy=this; |
1428 | cd.m_File=m_FileName; | 1437 | cd.m_File=m_FileName; |
1429 | cd.m_Host=inet_ntoa(m_Peer.sin_addr); | 1438 | cd.m_Host=inet_ntoa(m_Peer.sin_addr); |
1430 | switch(cd.DoModal()){ | 1439 | switch(cd.DoModal()){ |
1431 | case IDOK: | 1440 | case IDOK: |
1432 | m_Rename=FALSE; | 1441 | m_Rename=FALSE; |
1433 | m_bResume=FALSE; | 1442 | m_bResume=FALSE; |
1434 | return TRUE; | 1443 | return TRUE; |
1435 | case IDC_RENAME: | 1444 | case IDC_RENAME: |
1436 | m_bResume=FALSE; | 1445 | m_bResume=FALSE; |
1437 | m_Rename=TRUE; | 1446 | m_Rename=TRUE; |
1438 | return TRUE; | 1447 | return TRUE; |
1439 | case IDC_RESUME: | 1448 | case IDC_RESUME: |
1440 | m_Rename=FALSE; | 1449 | m_Rename=FALSE; |
1441 | m_bResume=TRUE; | 1450 | m_bResume=TRUE; |
1442 | return TRUE; | 1451 | return TRUE; |
1443 | case IDCANCEL: | 1452 | case IDCANCEL: |
1444 | return FALSE; | 1453 | return FALSE; |
1445 | } | 1454 | } |
1446 | return FALSE; | 1455 | return FALSE; |
1447 | } | 1456 | } |
1448 | 1457 | ||
1449 | BOOL CWRQSocket::RenameFile(CString& fn) | 1458 | BOOL CWRQSocket::RenameFile(CString& fn) |
1450 | { | 1459 | { |
1451 | CString renamed = fn; | 1460 | CString renamed = fn; |
1452 | if(fn.IsEmpty()) | 1461 | if(fn.IsEmpty()) |
1453 | return FALSE; | 1462 | return FALSE; |
1454 | if(fn[fn.GetLength()-1]==')'){ | 1463 | if(fn[fn.GetLength()-1]==')'){ |
1455 | int op = fn.ReverseFind('('); | 1464 | int op = fn.ReverseFind('('); |
1456 | if(op>0 && fn[op-1]==' '){ | 1465 | if(op>0 && fn[op-1]==' '){ |
1457 | if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) | 1466 | if(fn.Mid(op+1,fn.GetLength()-op-2).SpanExcluding("0123456789").IsEmpty()) |
1458 | renamed = renamed.Left(op-1); | 1467 | renamed = renamed.Left(op-1); |
1459 | } | 1468 | } |