This source file includes following definitions.
- Put_File
- Put_List
- Run
- Get_File
- Get_List
- Run
- Delete_File
- Delete_List
- Run
1 #include "Directory.h"
2
3 #include "BF_Dict.h"
4 #include "BF_Roster.h"
5
6 #include "BF_GUI_FtpPanel.h"
7 #include "BF_GUI_KeysMenu.h"
8 #include "BF_GUI_WinMain.h"
9 #include "BF_GUI_FtpPanel_Tasks.h"
10
11
12 BF_GUI_FtpPanel_UploadTask::BF_GUI_FtpPanel_UploadTask(
13 BL_String & s_PathSrc,
14 BF_GUI_FtpPanel *po_Panel,
15 BF_NodeCollection & lo_Node,
16 bool b_FilesMove
17 ):BF_GUI_OperTask("upload to ftp",BF_GUI_OPERTASK_STYLE_DEFAULT)
18 {
19 iOperIndex = 0;
20 iOperCount = 0;
21 bFilesMove = b_FilesMove;
22
23 ASSERT(po_Panel);
24 poPanel = po_Panel;
25 poFtp = po_Panel->poClient;;
26 poBookmark = po_Panel->poBookmark;
27 ASSERT(poFtp && poBookmark);
28
29 oPathSrc.SetTo(s_PathSrc.String());
30 lo_Node.CopyTo(loNode,false);
31 loNode.SetSelfPath(&oPathSrc);
32 }
33
34 void
35 BF_GUI_FtpPanel_UploadTask::Put_File(BF_Node *po_Node)
36 {
37 ASSERT(po_Node);
38
39 bool rc = false;
40 string cmd, replystr;
41 int code, codetype, i;
42 ssize_t rlen, slen;
43
44 BL_String s;
45
46 s=oPathSrc.Path();
47 s<<"/";
48 s<<po_Node->Name();
49 BFile oFileSrc(s.String(), B_READ_ONLY);
50
51 if(oFileSrc.InitCheck() != B_NO_ERROR){
52
53 return;
54 }
55
56 char buf[8192], sbuf[16384], *stmp;
57
58 if(!poBookmark->bAscii_Mode)
59 cmd = "TYPE I";
60 else
61 cmd = "TYPE A";
62
63 if(poFtp->p_sendRequest(cmd))
64 poFtp->p_getReply(replystr, code, codetype);
65
66 try
67 {
68 cmd = "STOR ";
69 cmd += po_Node->Name();
70 if( poFtp->p_openDataConnection() &&
71 poFtp->p_sendRequest(cmd) &&
72 poFtp->p_getReply(replystr, code, codetype) &&
73 codetype <= 2 &&
74 poFtp->p_acceptDataConnection()) {
75 rlen = 1;
76 while(rlen > 0)
77 {
78 memset(buf, 0, sizeof(buf));
79 memset(sbuf, 0, sizeof(sbuf));
80 rlen = oFileSrc.Read((void *) buf, sizeof(buf));
81 slen = rlen;
82 stmp = buf;
83 if(poBookmark->bAscii_Mode)
84 {
85 stmp = sbuf;
86 slen = 0;
87 for(i=0;i<rlen;i++)
88 {
89 if(buf[i] == '\n')
90 {
91 *stmp = '\r';
92 stmp++;
93 slen++;
94 }
95 *stmp = buf[i];
96 stmp++;
97 slen++;
98 }
99 stmp = sbuf;
100 }
101 if(slen > 0)
102 {
103 size_t amount = poFtp->m_data->Send(stmp, (size_t) slen);
104 if(amount < 0) throw "bail";
105 if(amount > 0){
106 iOperIndex += amount;
107 SetProgress(iOperIndex,iOperCount);
108 }
109 }
110 }
111
112 rc = true;
113 }
114 }
115
116 catch(const char *errstr)
117 {
118
119 }
120
121 DELETE(poFtp->m_data);
122 poFtp->m_data = 0;
123
124 if(rc == true)
125 {
126 poFtp->p_getReply(replystr, code, codetype);
127 rc = (bool) codetype <= 2;
128 }
129
130
131
132 return;
133 }
134
135 void
136 BF_GUI_FtpPanel_UploadTask::Put_List(BF_NodeCollection *plo_Node)
137 {
138 ASSERT(plo_Node);
139
140 BF_Node *poNode;
141 for(int i=0;i<plo_Node->CountItems();i++){
142 poNode = plo_Node->NodeAt(i);
143 Put_File(poNode);
144 }
145 }
146
147 void
148 BF_GUI_FtpPanel_UploadTask::Run()
149 {
150 iOperIndex = 0;
151 iOperCount = loNode.SizeAll(true);
152 SetProgress(iOperIndex,iOperCount);
153 Put_List(&loNode);
154
155
156 BMessenger oMessenger(poPanel);
157 BMessage oMessage(BF_FTP_MSG_DIR_RELOAD_START);
158 oMessenger.SendMessage(&oMessage);
159 }
160
161
162
163 BF_GUI_FtpPanel_DownloadTask::BF_GUI_FtpPanel_DownloadTask(
164 BL_String & s_PathDest,
165 BF_GUI_FtpPanel *po_Panel,
166 BF_NodeCollection & lo_Node,
167 bool b_FilesMove
168 ):BF_GUI_OperTask(BF_DictAt(BF_DICT_FTP_TASKDOWNLOAD),BF_GUI_OPERTASK_STYLE_DEFAULT)
169 {
170 iOperIndex = 0;
171 iOperCount = 0;
172 bFilesMove = b_FilesMove;
173
174 ASSERT(po_Panel);
175 poPanel = po_Panel;
176 poFtp = po_Panel->poClient;;
177 poBookmark = po_Panel->poBookmark;
178 ASSERT(poFtp && poBookmark);
179
180 oPathDest.SetTo(s_PathDest.String());
181 lo_Node.CopyTo(loNode,false);
182 }
183
184 void
185 BF_GUI_FtpPanel_DownloadTask::Get_File(BF_Node *po_Node)
186 {
187 ASSERT(po_Node);
188
189 bool rc = false;
190 string cmd, replystr;
191 int code, codetype, i;
192 ssize_t rlen, slen;
193
194 BL_String sFileDest(oPathDest.Path());
195 sFileDest << "/";
196 sFileDest << po_Node->Name();
197
198 BFile oDestFile(sFileDest.String(), B_READ_WRITE | B_CREATE_FILE);
199
200 char buf[8192], sbuf[16384], *stmp;
201 bool writeerr = false;
202
203 if(oDestFile.InitCheck() != B_NO_ERROR){
204
205 return ;
206 }
207
208 if(!poBookmark->bAscii_Mode)
209 cmd = "TYPE I";
210 else
211 cmd = "TYPE A";
212
213 if(poFtp->p_sendRequest(cmd)) poFtp->p_getReply(replystr, code, codetype);
214
215
216 cmd = "RETR ";
217 cmd += po_Node->Name();
218 if( poFtp->p_openDataConnection() &&
219 poFtp->p_sendRequest(cmd) &&
220 poFtp->p_getReply(replystr, code, codetype) &&
221 codetype <= 2 &&
222 poFtp->p_acceptDataConnection())
223 {
224 rlen = 1;
225 rc = true;
226 while(rlen > 0)
227 {
228 memset(buf, 0, sizeof(buf));
229 memset(sbuf, 0, sizeof(sbuf));
230 rlen = poFtp->m_data->Receive(buf, sizeof(buf));
231
232 if(rlen > 0)
233 {
234
235 slen = rlen;
236 stmp = buf;
237 if(poBookmark->bAscii_Mode)
238 {
239 stmp = sbuf;
240 slen = 0;
241 for(i=0;i<rlen;i++)
242 {
243 if(buf[i] == '\r')
244 {
245 i++;
246 }
247 *stmp = buf[i];
248 stmp++;
249 slen++;
250 }
251 stmp = sbuf;
252 }
253
254 if(slen > 0)
255 {
256 slen = oDestFile.Write(stmp, (size_t) slen);
257 if(slen<0){
258 writeerr = true;
259 }else{
260 iOperIndex += slen;
261 SetProgress(iOperIndex,iOperCount);
262 }
263 }
264 }
265 }
266 }
267
268 DELETE(poFtp->m_data);
269 poFtp->m_data = 0;
270
271 if(rc == true)
272 {
273 poFtp->p_getReply(replystr, code, codetype);
274 rc = (bool) ((codetype <= 2) && (writeerr == false));
275 }
276
277
278 }
279
280 void
281 BF_GUI_FtpPanel_DownloadTask::Get_List(BF_NodeCollection *plo_Node)
282 {
283 ASSERT(plo_Node);
284
285 BF_Node *poNode;
286 for(int i=0;i<plo_Node->CountItems();i++){
287 poNode = plo_Node->NodeAt(i);
288 Get_File(poNode);
289 }
290 }
291
292 void
293 BF_GUI_FtpPanel_DownloadTask::Run()
294 {
295 iOperIndex = 0;
296 iOperCount = loNode.SizeAll(true);
297 SetProgress(iOperIndex,iOperCount);
298 Get_List(&loNode);
299
300
301 BMessenger oMessenger(poPanel);
302 BMessage oMessage(BF_FTP_MSG_DIR_RELOAD_START);
303 oMessenger.SendMessage(&oMessage);
304 }
305
306
307 BF_GUI_FtpPanel_DeleteTask::BF_GUI_FtpPanel_DeleteTask(
308 BF_GUI_FtpPanel *po_Panel,
309 BF_NodeCollection & lo_Node
310 ):BF_GUI_OperTask(BF_DictAt(BF_DICT_FTP_TASKDEL),BF_GUI_OPERTASK_STYLE_DEFAULT)
311 {
312 iOperIndex = 0;
313 iOperCount = 0;
314
315 ASSERT(po_Panel);
316 poPanel = po_Panel;
317 poFtp = po_Panel->poClient;;
318 poBookmark = po_Panel->poBookmark;
319 ASSERT(poFtp && poBookmark);
320
321 lo_Node.CopyTo(loNode,false);
322 }
323
324 void
325 BF_GUI_FtpPanel_DeleteTask::Delete_File(BF_Node *po_Node)
326 {
327 ASSERT(po_Node);
328
329 bool rc = false;
330 string request = "DELE ";
331 string replystr;
332 int code, codetype;
333
334 request += po_Node->Name();
335
336
337 if(poFtp->p_sendRequest(request)&& poFtp->p_getReply(replystr, code, codetype)&& codetype == 2) rc = true;
338
339 return;
340 }
341
342 void
343 BF_GUI_FtpPanel_DeleteTask::Delete_List(BF_NodeCollection *plo_Node)
344 {
345 ASSERT(plo_Node);
346
347 BF_Node *poNode;
348 for(int i=0;i<plo_Node->CountItems();i++){
349 poNode = plo_Node->NodeAt(i);
350 switch(poNode->iType){
351 case BF_NODE_TYPE_FILE:
352 Delete_File(poNode);
353 break;
354 }
355 SetProgress(++iOperIndex,iOperCount);
356 }
357 }
358
359 void
360 BF_GUI_FtpPanel_DeleteTask::Run()
361 {
362 iOperIndex = 0;
363 iOperCount = loNode.CountAll(true);
364 SetProgress(iOperIndex,iOperCount);
365 Delete_List(&loNode);
366
367
368 BMessenger oMessenger(poPanel);
369 BMessage oMessage(BF_FTP_MSG_DIR_RELOAD_START);
370 oMessenger.SendMessage(&oMessage);