blob: a0c1cf9678906b101ecfc1e311516f7d3ed7788c [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;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +000033 m_bResized = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000034
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000035 m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000036
37 m_pReader = NULL;
38 m_pWriter = NULL;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +000039
40 m_dw64SizeSending = 0;
41 m_dirSizeRqstNum = 0;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000042}
43
44FileTransfer::~FileTransfer()
45{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000046 if (m_pFTDialog != NULL) {
47 delete m_pFTDialog;
48 m_pFTDialog = NULL;
49 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000050
Dennis Syrovatsky1f868512005-12-14 07:38:19 +000051 if (m_pReader != NULL) {
52 delete m_pReader;
53 m_pReader = NULL;
54 }
55
56 if (m_pWriter != NULL) {
57 delete m_pWriter;
58 m_pWriter = NULL;
59 }
60
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000061 freeQueues();
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000062}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000063
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000064bool
65FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
66{
67 if (m_bInitialized) return false;
68
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000069 m_pReader = new FTMsgReader(pIS);
70 m_pWriter = new FTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000071
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000072 freeQueues();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000073
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000074 m_bInitialized = true;
75 return true;
76}
77
78bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000079FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000080{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000081 if (!m_bInitialized) return false;
82
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000083 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000084
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000085 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000086}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000087
88bool
89FileTransfer::processFTMsg(int type)
90{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000091 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000092
93 switch (type)
94 {
95 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000096 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000097 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000098 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000099 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000100 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000101 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000102 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000103 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000104 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000105 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000106 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000107 default:
108 return false;
109 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000110}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000111
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000112bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000113FileTransfer::isTransferEnable()
114{
115 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
116}
117
118void
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000119FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
120{
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000121 if ((m_bFTDlgShown) && (m_DeleteQueue.getNumEntries() > 0))
122 m_pFTDialog->setStatusText("Starting Delete Operation");
123
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000124 m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000125
126 checkDeleteQueue();
127}
128
129void
130FileTransfer::checkDeleteQueue()
131{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000132 if (m_DeleteQueue.getNumEntries() > 0) {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000133 if (m_bFTDlgShown)
134 m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000135 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
136 FolderManager fm;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000137 if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000138 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
139 } else {
140 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
141 }
142 m_DeleteQueue.deleteAt(0);
143 m_pFTDialog->postCheckDeleteQueueMsg();
144 } else {
145 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
146 m_pWriter->writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
147 m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000148
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000149 char *pPath = m_DeleteQueue.getLocPathAt(0);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000150 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
151 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
152 }
153 }
154 } else {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000155 if (m_bFTDlgShown) {
156 m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
157 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
158 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
159 }
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000160 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000161}
162
163void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000164FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
165 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000166{
167 if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
168
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000169 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000170
171 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000172}
173
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000174bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000175FileTransfer::resizeSending()
176{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000177 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
178 unsigned int flags = m_TransferQueue.getFlagsAt(i);
179 if (flags & FT_ATTR_RESIZE_NEEDED) {
180 if (flags & FT_ATTR_FILE) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000181 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000182 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
183 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
184 } else {
185 if (flags & FT_ATTR_DIR) {
186 if (flags & FT_ATTR_COPY_DOWNLOAD) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000187 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000188 char *pPath = m_TransferQueue.getFullRemPathAt(i);
189 m_dirSizeRqstNum = i;
190 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
191 return false;
192 } else {
193 if (flags & FT_ATTR_COPY_UPLOAD) {
194 FolderManager fm;
195 DWORD64 dw64Size;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000196 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000197 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
198 m_dw64SizeSending += dw64Size;
199 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
200 }
201 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
202 } // if (flags & FT_ATTR_FOLDER)
203 } // if (flags & FT_ATTR_FILE)
204 } // if (flags & FT_ATTR_NEEDED_RESIZE)
205 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000206
207 if ((m_bFTDlgShown) && (m_bResized)) {
208 m_pFTDialog->m_pProgress->clearAndInitGeneral(m_dw64SizeSending, 0);
209 m_bResized = false;
210 }
211
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000212 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000213}
214
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000215void
216FileTransfer::checkTransferQueue()
217{
218 if (!isTransferEnable()) {
219 if (m_bFTDlgShown) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000220 m_pFTDialog->m_pProgress->clearAll();
221 m_dw64SizeSending = 0;
222 m_bResized = false;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000223 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
224 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
225 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
226 return;
227 }
228 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000229 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000230
231 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000232
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000233 if (flag0 & FT_ATTR_COPY_UPLOAD) {
234 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000235 uploadFile();
236 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000237 }
238 if (flag0 & FT_ATTR_DIR) {
239 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
240 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
241 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
242
243 char *pPath = m_TransferQueue.getRemPathAt(0);
244 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
245 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000246 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000247 return;
248 }
249 } else {
250 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
251 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000252 downloadFile();
253 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000254 }
255 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000256 FolderManager fm;
257 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
258 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
259
260 if (!fm.createDir(pLocPath)) {
261 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
262 m_TransferQueue.deleteAt(0);
263 m_pFTDialog->postCheckTransferQueueMsg();
264 return;
265 } else {
266 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
267 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
268
269 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
270 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
271 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
272 m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000273 return;
274 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000275 }
276 }
277 }
278 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000279 } // if (!isTransferEnable())
280}
281
282bool
283FileTransfer::uploadFile()
284{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000285 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
286 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000287
288 if (m_bFTDlgShown) {
289 m_pFTDialog->setStatusText("Upload Started: %s to %s",
290 m_TransferQueue.getFullLocPathAt(0),
291 m_TransferQueue.getFullRemPathAt(0));
292 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
293 }
294
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000295 m_pWriter->writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
296 m_TransferQueue.getFullRemPathAt(0), 0);
297 uploadFilePortion();
298 }
299 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000300 return false;
301}
302
303bool
304FileTransfer::downloadFile()
305{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000306 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
307 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000308 if (m_bFTDlgShown) {
309 m_pFTDialog->setStatusText("Download Started: %s to %s",
310 m_TransferQueue.getFullRemPathAt(0),
311 m_TransferQueue.getFullLocPathAt(0));
312 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
313 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000314 m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
315 m_TransferQueue.getFullRemPathAt(0), 0);
316 return true;
317 } else return false;
318 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000319 return false;
320}
321
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000322void
323FileTransfer::uploadFilePortion()
324{
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000325 if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
326
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000327 if (m_fileReader.isCreated()) {
328 char buf[FT_MAX_SENDING_SIZE];
329 unsigned int bytesRead = 0;
330 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
331 if (bytesRead == 0) {
332 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
333 m_fileReader.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000334 if (m_bFTDlgShown) {
335 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000336 m_pFTDialog->setStatusText("Upload Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000337 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000338 m_TransferQueue.deleteAt(0);
339 m_pFTDialog->postCheckTransferQueueMsg();
340 } else {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000341 if (m_bFTDlgShown) m_pFTDialog->m_pProgress->increase(bytesRead);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000342 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
343 m_pFTDialog->postUploadFilePortionMsg();
344 }
345 } else {
346 m_fileReader.close();
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000347 char reason[] = "Error While Reading File";
348 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000349 if (m_bFTDlgShown) {
350 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
351 m_pFTDialog->setStatusText("Upload Failed");
352 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000353 m_TransferQueue.deleteAt(0);
354 m_pFTDialog->postCheckTransferQueueMsg();
355 }
356 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000357}
358
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000359bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000360FileTransfer::procFileListDataMsg()
361{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000362 FileInfo fileInfo;
363 int res = m_pReader->readFileListData(&fileInfo);
364
365 bool bResult;
366 switch (m_queueFileListRqst.getFlagsAt(0))
367 {
368 case FT_FLR_DEST_MAIN:
369 if (!m_bFTDlgShown) break;
370
371 if (res < 0) {
372 m_pFTDialog->reqFolderUnavailable();
373 bResult = true;
374 } else {
375 bResult = procFLRMain(&fileInfo);
376 }
377 break;
378 case FT_FLR_DEST_BROWSE:
379 bResult = procFLRBrowse(&fileInfo);
380 break;
381 case FT_FLR_DEST_UPLOAD:
382 bResult = procFLRUpload(&fileInfo);
383 break;
384 case FT_FLR_DEST_DOWNLOAD:
385 bResult = procFLRDownload(&fileInfo);
386 break;
387 case FT_FLR_DEST_DELETE:
388 bResult = procFLRDelete(&fileInfo);
389 break;
390 case FT_FLR_DEST_RENAME:
391 bResult = procFLRRename(&fileInfo);
392 break;
393 }
394 m_queueFileListRqst.deleteAt(0);
395 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000396}
397
398bool
399FileTransfer::procFileDownloadDataMsg()
400{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000401 unsigned int bufSize = 0;
402 unsigned int modTime = 0;
403
404 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
405
406 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
407 if (pFile != NULL) delete pFile;
408 return false;
409 }
410
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000411 if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
412
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000413 if (bufSize > 0) {
414 unsigned int bytesWritten = 0;
415 m_fileWriter.write(pFile, bufSize, &bytesWritten);
416 delete pFile;
417 if (bytesWritten != bufSize) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000418 char reason[] = "Error File Writting to File";
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000419 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000420 if (m_bFTDlgShown) {
421 m_pFTDialog->setStatusText("Download Failed");
422 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
423 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000424 m_TransferQueue.deleteAt(0);
425 m_pFTDialog->postCheckTransferQueueMsg();
426 return false;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000427 } else {
428 if (m_bFTDlgShown) {
429 m_pFTDialog->m_pProgress->increase(bufSize);
430 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000431 }
432 return true;
433 } else {
434 if (modTime != 0) {
435 m_fileWriter.setTime(modTime);
436 m_fileWriter.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000437 if (m_bFTDlgShown) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000438 m_pFTDialog->setStatusText("Download Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000439 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
440 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000441 m_TransferQueue.deleteAt(0);
442 m_pFTDialog->postCheckTransferQueueMsg();
443 return true;
444 } else {
445 m_fileWriter.close();
446 char reason[] = "Error File Writting";
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000447 if (m_bFTDlgShown) {
448 m_pFTDialog->setStatusText("Download Failed");
449 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
450 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000451 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
452 m_TransferQueue.deleteAt(0);
453 m_pFTDialog->postCheckTransferQueueMsg();
454 }
455 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000456 return false;
457}
458
459bool
460FileTransfer::procFileUploadCancelMsg()
461{
462 return false;
463}
464
465bool
466FileTransfer::procFileDownloadFailedMsg()
467{
468 return false;
469}
470
471bool
472FileTransfer::procFileDirSizeDataMsg()
473{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000474 DWORD64 dw64DirSize = 0;
475 m_pReader->readFileDirSizeData(&dw64DirSize);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000476 m_dw64SizeSending += dw64DirSize;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000477 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000478 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000479 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000480}
481
482bool
483FileTransfer::procFileLastRqstFailedMsg()
484{
485 return false;
486}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000487
488bool
489FileTransfer::procFLRMain(FileInfo *pFI)
490{
491 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
492 return true;
493}
494
495bool
496FileTransfer::procFLRBrowse(FileInfo *pFI)
497{
498 return false;
499}
500
501bool
502FileTransfer::procFLRUpload(FileInfo *pFI)
503{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000504 unsigned int flags = m_TransferQueue.getFlagsAt(0);
505 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
506 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
507 if (num >= 0) {
508 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
509 m_pFTDialog->addRemoteLVItems(pFI);
510 }
511 } else {
512 if (flags & FT_ATTR_DIR) {
513 m_TransferQueue.deleteAt(0);
514 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
515 }
516 }
517 }
518 FolderManager fm;
519 FileInfo fi;
520 flags = m_TransferQueue.getFlagsAt(0);
521 if (flags & FT_ATTR_FILE) {
522 uploadFile();
523 return true;
524 } else {
525 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
526 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
527 m_TransferQueue.getFullRemPathAt(0),
528 &fi, FT_ATTR_COPY_UPLOAD);
529 }
530 }
531 m_TransferQueue.deleteAt(0);
532 m_pFTDialog->postCheckTransferQueueMsg();
533 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000534}
535
536bool
537FileTransfer::procFLRDownload(FileInfo *pFI)
538{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000539 unsigned int flags = m_TransferQueue.getFlagsAt(0);
540
541 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000542 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
543 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000544 pFI, FT_ATTR_COPY_DOWNLOAD);
545 m_TransferQueue.deleteAt(0);
546 m_pFTDialog->postCheckTransferQueueMsg();
547 return true;
548 } else {
549 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
550 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000551 return false;
552}
553
554bool
555FileTransfer::procFLRDelete(FileInfo *pFI)
556{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000557 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
558 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
559 } else {
560 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
561 }
562 m_DeleteQueue.deleteAt(0);
563 checkDeleteQueue();
564 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000565}
566
567bool
568FileTransfer::procFLRRename(FileInfo *pFI)
569{
570 return false;
571}
572
573void
574FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
575{
576 m_queueFileListRqst.add(pPath, 0, 0, dest);
577
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000578 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000579}
580
581int
582FileTransfer::isExistName(FileInfo *pFI, char *pName)
583{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000584 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000585 if (strcmp(pFI->getNameAt(i), pName) == 0) {
586 return i;
587 }
588 }
589 return -1;
590}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000591
592void
593FileTransfer::freeQueues()
594{
595 m_TransferQueue.free();
596 m_DeleteQueue.free();
597}