blob: f607bbbfa3caf90ce6d6b0986c6e95206959aa43 [file] [log] [blame]
Dennis Syrovatsky139d7832005-11-02 05:36:05 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 *
18 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
19 *
20 */
21
22// -=- FileTransfer.cxx
23
24#include <vncviewer/FileTransfer.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
29FileTransfer::FileTransfer()
30{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000031 m_bFTDlgShown = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000032 m_bInitialized = false;
33
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000034 m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000035
36 m_pReader = NULL;
37 m_pWriter = NULL;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +000038
39 m_dw64SizeSending = 0;
40 m_dirSizeRqstNum = 0;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000041}
42
43FileTransfer::~FileTransfer()
44{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000045 if (m_pFTDialog != NULL) {
46 delete m_pFTDialog;
47 m_pFTDialog = NULL;
48 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000049
50 freeQueues();
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000051}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000052
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000053bool
54FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
55{
56 if (m_bInitialized) return false;
57
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000058 m_pReader = new FTMsgReader(pIS);
59 m_pWriter = new FTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000060
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000061 freeQueues();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000062
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000063 m_bInitialized = true;
64 return true;
65}
66
67bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000068FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000069{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000070 if (!m_bInitialized) return false;
71
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000072 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000073
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000074 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000075}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000076
77bool
78FileTransfer::processFTMsg(int type)
79{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000080 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000081
82 switch (type)
83 {
84 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000085 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000086 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000087 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000088 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000089 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000090 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000091 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000092 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000093 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000094 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000095 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000096 default:
97 return false;
98 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000099}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000100
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000101bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000102FileTransfer::isTransferEnable()
103{
104 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
105}
106
107void
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000108FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
109{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000110 m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000111
112 checkDeleteQueue();
113}
114
115void
116FileTransfer::checkDeleteQueue()
117{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000118 if (m_DeleteQueue.getNumEntries() > 0) {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000119 if (m_bFTDlgShown)
120 m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000121 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
122 FolderManager fm;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000123 if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000124 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
125 } else {
126 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
127 }
128 m_DeleteQueue.deleteAt(0);
129 m_pFTDialog->postCheckDeleteQueueMsg();
130 } else {
131 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
132 m_pWriter->writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
133 m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000134
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000135 char *pPath = m_DeleteQueue.getLocPathAt(0);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000136 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
137 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
138 }
139 }
140 } else {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000141 if (m_bFTDlgShown) {
142 m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
143 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
144 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
145 }
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000146 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000147}
148
149void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000150FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
151 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000152{
153 if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
154
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000155 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000156
157 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000158}
159
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000160bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000161FileTransfer::resizeSending()
162{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000163 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
164 unsigned int flags = m_TransferQueue.getFlagsAt(i);
165 if (flags & FT_ATTR_RESIZE_NEEDED) {
166 if (flags & FT_ATTR_FILE) {
167 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
168 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
169 } else {
170 if (flags & FT_ATTR_DIR) {
171 if (flags & FT_ATTR_COPY_DOWNLOAD) {
172 char *pPath = m_TransferQueue.getFullRemPathAt(i);
173 m_dirSizeRqstNum = i;
174 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
175 return false;
176 } else {
177 if (flags & FT_ATTR_COPY_UPLOAD) {
178 FolderManager fm;
179 DWORD64 dw64Size;
180 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
181 m_dw64SizeSending += dw64Size;
182 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
183 }
184 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
185 } // if (flags & FT_ATTR_FOLDER)
186 } // if (flags & FT_ATTR_FILE)
187 } // if (flags & FT_ATTR_NEEDED_RESIZE)
188 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
189 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000190}
191
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000192void
193FileTransfer::checkTransferQueue()
194{
195 if (!isTransferEnable()) {
196 if (m_bFTDlgShown) {
197 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
198 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
199 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
200 return;
201 }
202 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000203 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000204
205 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000206
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000207 if (flag0 & FT_ATTR_COPY_UPLOAD) {
208 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000209 uploadFile();
210 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000211 }
212 if (flag0 & FT_ATTR_DIR) {
213 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
214 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
215 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
216
217 char *pPath = m_TransferQueue.getRemPathAt(0);
218 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
219 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000220 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000221 return;
222 }
223 } else {
224 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
225 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000226 downloadFile();
227 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000228 }
229 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000230 FolderManager fm;
231 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
232 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
233
234 if (!fm.createDir(pLocPath)) {
235 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
236 m_TransferQueue.deleteAt(0);
237 m_pFTDialog->postCheckTransferQueueMsg();
238 return;
239 } else {
240 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
241 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
242
243 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
244 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
245 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
246 m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000247 return;
248 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000249 }
250 }
251 }
252 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000253 } // if (!isTransferEnable())
254}
255
256bool
257FileTransfer::uploadFile()
258{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000259 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
260 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
261 m_pWriter->writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
262 m_TransferQueue.getFullRemPathAt(0), 0);
263 uploadFilePortion();
264 }
265 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000266 return false;
267}
268
269bool
270FileTransfer::downloadFile()
271{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000272 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
273 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
274 m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
275 m_TransferQueue.getFullRemPathAt(0), 0);
276 return true;
277 } else return false;
278 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000279 return false;
280}
281
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000282void
283FileTransfer::uploadFilePortion()
284{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000285 if (m_fileReader.isCreated()) {
286 char buf[FT_MAX_SENDING_SIZE];
287 unsigned int bytesRead = 0;
288 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
289 if (bytesRead == 0) {
290 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
291 m_fileReader.close();
292 m_TransferQueue.deleteAt(0);
293 m_pFTDialog->postCheckTransferQueueMsg();
294 } else {
295 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
296 m_pFTDialog->postUploadFilePortionMsg();
297 }
298 } else {
299 m_fileReader.close();
300 m_TransferQueue.deleteAt(0);
301 m_pFTDialog->postCheckTransferQueueMsg();
302 }
303 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000304}
305
306void
307FileTransfer::downloadFilePortion()
308{
309
310}
311
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000312bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000313FileTransfer::procFileListDataMsg()
314{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000315 FileInfo fileInfo;
316 int res = m_pReader->readFileListData(&fileInfo);
317
318 bool bResult;
319 switch (m_queueFileListRqst.getFlagsAt(0))
320 {
321 case FT_FLR_DEST_MAIN:
322 if (!m_bFTDlgShown) break;
323
324 if (res < 0) {
325 m_pFTDialog->reqFolderUnavailable();
326 bResult = true;
327 } else {
328 bResult = procFLRMain(&fileInfo);
329 }
330 break;
331 case FT_FLR_DEST_BROWSE:
332 bResult = procFLRBrowse(&fileInfo);
333 break;
334 case FT_FLR_DEST_UPLOAD:
335 bResult = procFLRUpload(&fileInfo);
336 break;
337 case FT_FLR_DEST_DOWNLOAD:
338 bResult = procFLRDownload(&fileInfo);
339 break;
340 case FT_FLR_DEST_DELETE:
341 bResult = procFLRDelete(&fileInfo);
342 break;
343 case FT_FLR_DEST_RENAME:
344 bResult = procFLRRename(&fileInfo);
345 break;
346 }
347 m_queueFileListRqst.deleteAt(0);
348 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000349}
350
351bool
352FileTransfer::procFileDownloadDataMsg()
353{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000354 unsigned int bufSize = 0;
355 unsigned int modTime = 0;
356
357 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
358
359 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
360 if (pFile != NULL) delete pFile;
361 return false;
362 }
363
364 if (bufSize > 0) {
365 unsigned int bytesWritten = 0;
366 m_fileWriter.write(pFile, bufSize, &bytesWritten);
367 delete pFile;
368 if (bytesWritten != bufSize) {
369 char reason[] = "Error File Writting";
370 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
371 m_TransferQueue.deleteAt(0);
372 m_pFTDialog->postCheckTransferQueueMsg();
373 return false;
374 }
375 return true;
376 } else {
377 if (modTime != 0) {
378 m_fileWriter.setTime(modTime);
379 m_fileWriter.close();
380 m_TransferQueue.deleteAt(0);
381 m_pFTDialog->postCheckTransferQueueMsg();
382 return true;
383 } else {
384 m_fileWriter.close();
385 char reason[] = "Error File Writting";
386 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
387 m_TransferQueue.deleteAt(0);
388 m_pFTDialog->postCheckTransferQueueMsg();
389 }
390 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000391 return false;
392}
393
394bool
395FileTransfer::procFileUploadCancelMsg()
396{
397 return false;
398}
399
400bool
401FileTransfer::procFileDownloadFailedMsg()
402{
403 return false;
404}
405
406bool
407FileTransfer::procFileDirSizeDataMsg()
408{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000409 DWORD64 dw64DirSize = 0;
410 m_pReader->readFileDirSizeData(&dw64DirSize);
411 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000412 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000413 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000414}
415
416bool
417FileTransfer::procFileLastRqstFailedMsg()
418{
419 return false;
420}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000421
422bool
423FileTransfer::procFLRMain(FileInfo *pFI)
424{
425 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
426 return true;
427}
428
429bool
430FileTransfer::procFLRBrowse(FileInfo *pFI)
431{
432 return false;
433}
434
435bool
436FileTransfer::procFLRUpload(FileInfo *pFI)
437{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000438 unsigned int flags = m_TransferQueue.getFlagsAt(0);
439 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
440 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
441 if (num >= 0) {
442 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
443 m_pFTDialog->addRemoteLVItems(pFI);
444 }
445 } else {
446 if (flags & FT_ATTR_DIR) {
447 m_TransferQueue.deleteAt(0);
448 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
449 }
450 }
451 }
452 FolderManager fm;
453 FileInfo fi;
454 flags = m_TransferQueue.getFlagsAt(0);
455 if (flags & FT_ATTR_FILE) {
456 uploadFile();
457 return true;
458 } else {
459 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
460 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
461 m_TransferQueue.getFullRemPathAt(0),
462 &fi, FT_ATTR_COPY_UPLOAD);
463 }
464 }
465 m_TransferQueue.deleteAt(0);
466 m_pFTDialog->postCheckTransferQueueMsg();
467 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000468}
469
470bool
471FileTransfer::procFLRDownload(FileInfo *pFI)
472{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000473 unsigned int flags = m_TransferQueue.getFlagsAt(0);
474
475 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000476 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
477 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000478 pFI, FT_ATTR_COPY_DOWNLOAD);
479 m_TransferQueue.deleteAt(0);
480 m_pFTDialog->postCheckTransferQueueMsg();
481 return true;
482 } else {
483 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
484 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000485 return false;
486}
487
488bool
489FileTransfer::procFLRDelete(FileInfo *pFI)
490{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000491 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
492 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
493 } else {
494 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
495 }
496 m_DeleteQueue.deleteAt(0);
497 checkDeleteQueue();
498 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000499}
500
501bool
502FileTransfer::procFLRRename(FileInfo *pFI)
503{
504 return false;
505}
506
507void
508FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
509{
510 m_queueFileListRqst.add(pPath, 0, 0, dest);
511
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000512 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000513}
514
515int
516FileTransfer::isExistName(FileInfo *pFI, char *pName)
517{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000518 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000519 if (strcmp(pFI->getNameAt(i), pName) == 0) {
520 return i;
521 }
522 }
523 return -1;
524}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000525
526void
527FileTransfer::freeQueues()
528{
529 m_TransferQueue.free();
530 m_DeleteQueue.free();
531}