blob: 0eb5fe74eb960d1a9523969d964c87b4bb1c8d34 [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
Dennis Syrovatsky1f868512005-12-14 07:38:19 +000050 if (m_pReader != NULL) {
51 delete m_pReader;
52 m_pReader = NULL;
53 }
54
55 if (m_pWriter != NULL) {
56 delete m_pWriter;
57 m_pWriter = NULL;
58 }
59
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000060 freeQueues();
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000061}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000062
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000063bool
64FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
65{
66 if (m_bInitialized) return false;
67
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000068 m_pReader = new FTMsgReader(pIS);
69 m_pWriter = new FTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000070
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000071 freeQueues();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000072
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000073 m_bInitialized = true;
74 return true;
75}
76
77bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000078FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000079{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000080 if (!m_bInitialized) return false;
81
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000082 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000083
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000084 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000085}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000086
87bool
88FileTransfer::processFTMsg(int type)
89{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000090 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000091
92 switch (type)
93 {
94 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000095 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000096 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000097 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000098 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000099 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000100 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000101 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000102 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000103 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000104 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000105 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000106 default:
107 return false;
108 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000109}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000110
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000111bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000112FileTransfer::isTransferEnable()
113{
114 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
115}
116
117void
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000118FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
119{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000120 m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000121
122 checkDeleteQueue();
123}
124
125void
126FileTransfer::checkDeleteQueue()
127{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000128 if (m_DeleteQueue.getNumEntries() > 0) {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000129 if (m_bFTDlgShown)
130 m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000131 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
132 FolderManager fm;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000133 if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000134 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
135 } else {
136 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
137 }
138 m_DeleteQueue.deleteAt(0);
139 m_pFTDialog->postCheckDeleteQueueMsg();
140 } else {
141 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
142 m_pWriter->writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
143 m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000144
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000145 char *pPath = m_DeleteQueue.getLocPathAt(0);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000146 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
147 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
148 }
149 }
150 } else {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000151 if (m_bFTDlgShown) {
152 m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
153 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
154 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
155 }
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000156 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000157}
158
159void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000160FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
161 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000162{
163 if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
164
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000165 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000166
167 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000168}
169
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000170bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000171FileTransfer::resizeSending()
172{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000173 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
174 unsigned int flags = m_TransferQueue.getFlagsAt(i);
175 if (flags & FT_ATTR_RESIZE_NEEDED) {
176 if (flags & FT_ATTR_FILE) {
177 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
178 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
179 } else {
180 if (flags & FT_ATTR_DIR) {
181 if (flags & FT_ATTR_COPY_DOWNLOAD) {
182 char *pPath = m_TransferQueue.getFullRemPathAt(i);
183 m_dirSizeRqstNum = i;
184 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
185 return false;
186 } else {
187 if (flags & FT_ATTR_COPY_UPLOAD) {
188 FolderManager fm;
189 DWORD64 dw64Size;
190 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
191 m_dw64SizeSending += dw64Size;
192 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
193 }
194 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
195 } // if (flags & FT_ATTR_FOLDER)
196 } // if (flags & FT_ATTR_FILE)
197 } // if (flags & FT_ATTR_NEEDED_RESIZE)
198 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
199 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000200}
201
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000202void
203FileTransfer::checkTransferQueue()
204{
205 if (!isTransferEnable()) {
206 if (m_bFTDlgShown) {
207 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
208 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
209 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
210 return;
211 }
212 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000213 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000214
215 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000216
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000217 if (flag0 & FT_ATTR_COPY_UPLOAD) {
218 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000219 uploadFile();
220 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000221 }
222 if (flag0 & FT_ATTR_DIR) {
223 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
224 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
225 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
226
227 char *pPath = m_TransferQueue.getRemPathAt(0);
228 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
229 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000230 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000231 return;
232 }
233 } else {
234 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
235 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000236 downloadFile();
237 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000238 }
239 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000240 FolderManager fm;
241 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
242 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
243
244 if (!fm.createDir(pLocPath)) {
245 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
246 m_TransferQueue.deleteAt(0);
247 m_pFTDialog->postCheckTransferQueueMsg();
248 return;
249 } else {
250 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
251 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
252
253 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
254 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
255 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
256 m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000257 return;
258 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000259 }
260 }
261 }
262 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000263 } // if (!isTransferEnable())
264}
265
266bool
267FileTransfer::uploadFile()
268{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000269 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
270 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000271 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Upload Started: %s to %s",
272 m_TransferQueue.getFullLocPathAt(0),
273 m_TransferQueue.getFullRemPathAt(0));
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000274 m_pWriter->writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
275 m_TransferQueue.getFullRemPathAt(0), 0);
276 uploadFilePortion();
277 }
278 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000279 return false;
280}
281
282bool
283FileTransfer::downloadFile()
284{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000285 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
286 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000287 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Download Started: %s to %s",
288 m_TransferQueue.getFullRemPathAt(0),
289 m_TransferQueue.getFullLocPathAt(0));
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000290 m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
291 m_TransferQueue.getFullRemPathAt(0), 0);
292 return true;
293 } else return false;
294 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000295 return false;
296}
297
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000298void
299FileTransfer::uploadFilePortion()
300{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000301 if (m_fileReader.isCreated()) {
302 char buf[FT_MAX_SENDING_SIZE];
303 unsigned int bytesRead = 0;
304 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
305 if (bytesRead == 0) {
306 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
307 m_fileReader.close();
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000308 if (m_bFTDlgShown)
309 m_pFTDialog->setStatusText("Upload Completed");
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000310 m_TransferQueue.deleteAt(0);
311 m_pFTDialog->postCheckTransferQueueMsg();
312 } else {
313 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
314 m_pFTDialog->postUploadFilePortionMsg();
315 }
316 } else {
317 m_fileReader.close();
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000318 char reason[] = "Error While Reading File";
319 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000320 m_TransferQueue.deleteAt(0);
321 m_pFTDialog->postCheckTransferQueueMsg();
322 }
323 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000324}
325
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000326bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000327FileTransfer::procFileListDataMsg()
328{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000329 FileInfo fileInfo;
330 int res = m_pReader->readFileListData(&fileInfo);
331
332 bool bResult;
333 switch (m_queueFileListRqst.getFlagsAt(0))
334 {
335 case FT_FLR_DEST_MAIN:
336 if (!m_bFTDlgShown) break;
337
338 if (res < 0) {
339 m_pFTDialog->reqFolderUnavailable();
340 bResult = true;
341 } else {
342 bResult = procFLRMain(&fileInfo);
343 }
344 break;
345 case FT_FLR_DEST_BROWSE:
346 bResult = procFLRBrowse(&fileInfo);
347 break;
348 case FT_FLR_DEST_UPLOAD:
349 bResult = procFLRUpload(&fileInfo);
350 break;
351 case FT_FLR_DEST_DOWNLOAD:
352 bResult = procFLRDownload(&fileInfo);
353 break;
354 case FT_FLR_DEST_DELETE:
355 bResult = procFLRDelete(&fileInfo);
356 break;
357 case FT_FLR_DEST_RENAME:
358 bResult = procFLRRename(&fileInfo);
359 break;
360 }
361 m_queueFileListRqst.deleteAt(0);
362 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000363}
364
365bool
366FileTransfer::procFileDownloadDataMsg()
367{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000368 unsigned int bufSize = 0;
369 unsigned int modTime = 0;
370
371 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
372
373 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
374 if (pFile != NULL) delete pFile;
375 return false;
376 }
377
378 if (bufSize > 0) {
379 unsigned int bytesWritten = 0;
380 m_fileWriter.write(pFile, bufSize, &bytesWritten);
381 delete pFile;
382 if (bytesWritten != bufSize) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000383 char reason[] = "Error File Writting to File";
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000384 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
385 m_TransferQueue.deleteAt(0);
386 m_pFTDialog->postCheckTransferQueueMsg();
387 return false;
388 }
389 return true;
390 } else {
391 if (modTime != 0) {
392 m_fileWriter.setTime(modTime);
393 m_fileWriter.close();
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000394 if (m_bFTDlgShown)
395 m_pFTDialog->setStatusText("Download Completed");
396
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000397 m_TransferQueue.deleteAt(0);
398 m_pFTDialog->postCheckTransferQueueMsg();
399 return true;
400 } else {
401 m_fileWriter.close();
402 char reason[] = "Error File Writting";
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000403 m_pFTDialog->setStatusText("Download Failed");
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000404 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
405 m_TransferQueue.deleteAt(0);
406 m_pFTDialog->postCheckTransferQueueMsg();
407 }
408 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000409 return false;
410}
411
412bool
413FileTransfer::procFileUploadCancelMsg()
414{
415 return false;
416}
417
418bool
419FileTransfer::procFileDownloadFailedMsg()
420{
421 return false;
422}
423
424bool
425FileTransfer::procFileDirSizeDataMsg()
426{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000427 DWORD64 dw64DirSize = 0;
428 m_pReader->readFileDirSizeData(&dw64DirSize);
429 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000430 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000431 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000432}
433
434bool
435FileTransfer::procFileLastRqstFailedMsg()
436{
437 return false;
438}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000439
440bool
441FileTransfer::procFLRMain(FileInfo *pFI)
442{
443 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
444 return true;
445}
446
447bool
448FileTransfer::procFLRBrowse(FileInfo *pFI)
449{
450 return false;
451}
452
453bool
454FileTransfer::procFLRUpload(FileInfo *pFI)
455{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000456 unsigned int flags = m_TransferQueue.getFlagsAt(0);
457 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
458 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
459 if (num >= 0) {
460 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
461 m_pFTDialog->addRemoteLVItems(pFI);
462 }
463 } else {
464 if (flags & FT_ATTR_DIR) {
465 m_TransferQueue.deleteAt(0);
466 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
467 }
468 }
469 }
470 FolderManager fm;
471 FileInfo fi;
472 flags = m_TransferQueue.getFlagsAt(0);
473 if (flags & FT_ATTR_FILE) {
474 uploadFile();
475 return true;
476 } else {
477 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
478 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
479 m_TransferQueue.getFullRemPathAt(0),
480 &fi, FT_ATTR_COPY_UPLOAD);
481 }
482 }
483 m_TransferQueue.deleteAt(0);
484 m_pFTDialog->postCheckTransferQueueMsg();
485 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000486}
487
488bool
489FileTransfer::procFLRDownload(FileInfo *pFI)
490{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000491 unsigned int flags = m_TransferQueue.getFlagsAt(0);
492
493 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000494 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
495 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000496 pFI, FT_ATTR_COPY_DOWNLOAD);
497 m_TransferQueue.deleteAt(0);
498 m_pFTDialog->postCheckTransferQueueMsg();
499 return true;
500 } else {
501 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
502 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000503 return false;
504}
505
506bool
507FileTransfer::procFLRDelete(FileInfo *pFI)
508{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000509 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
510 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
511 } else {
512 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
513 }
514 m_DeleteQueue.deleteAt(0);
515 checkDeleteQueue();
516 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000517}
518
519bool
520FileTransfer::procFLRRename(FileInfo *pFI)
521{
522 return false;
523}
524
525void
526FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
527{
528 m_queueFileListRqst.add(pPath, 0, 0, dest);
529
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000530 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000531}
532
533int
534FileTransfer::isExistName(FileInfo *pFI, char *pName)
535{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000536 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000537 if (strcmp(pFI->getNameAt(i), pName) == 0) {
538 return i;
539 }
540 }
541 return -1;
542}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000543
544void
545FileTransfer::freeQueues()
546{
547 m_TransferQueue.free();
548 m_DeleteQueue.free();
549}