blob: b324901eedde6580f0e7fc763758a3e5881afddd [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 Syrovatsky2142b4a2005-12-14 11:03:19 +000034 m_bCancel = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000035
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000036 m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000037
38 m_pReader = NULL;
39 m_pWriter = NULL;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +000040
41 m_dw64SizeSending = 0;
42 m_dirSizeRqstNum = 0;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000043}
44
45FileTransfer::~FileTransfer()
46{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000047 if (m_pFTDialog != NULL) {
48 delete m_pFTDialog;
49 m_pFTDialog = NULL;
50 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000051
Dennis Syrovatsky1f868512005-12-14 07:38:19 +000052 if (m_pReader != NULL) {
53 delete m_pReader;
54 m_pReader = NULL;
55 }
56
57 if (m_pWriter != NULL) {
58 delete m_pWriter;
59 m_pWriter = NULL;
60 }
61
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000062 freeQueues();
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000063}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000064
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000065bool
66FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
67{
68 if (m_bInitialized) return false;
69
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000070 m_pReader = new FTMsgReader(pIS);
71 m_pWriter = new FTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000072
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000073 freeQueues();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000074
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000075 m_bInitialized = true;
76 return true;
77}
78
79bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000080FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000081{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000082 if (!m_bInitialized) return false;
83
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000084 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000085
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000086 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000087}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000088
89bool
90FileTransfer::processFTMsg(int type)
91{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000092 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000093
94 switch (type)
95 {
96 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000097 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000098 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000099 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000100 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000101 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000102 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000103 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000104 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000105 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000106 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000107 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000108 default:
109 return false;
110 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000111}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000112
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000113bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000114FileTransfer::isTransferEnable()
115{
116 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
117}
118
119void
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000120FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
121{
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000122 if ((m_bFTDlgShown) && (m_DeleteQueue.getNumEntries() > 0))
123 m_pFTDialog->setStatusText("Starting Delete Operation");
124
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000125 m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000126
127 checkDeleteQueue();
128}
129
130void
131FileTransfer::checkDeleteQueue()
132{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000133 if (m_DeleteQueue.getNumEntries() > 0) {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000134 if (m_bFTDlgShown)
135 m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000136 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
137 FolderManager fm;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000138 if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000139 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
140 } else {
141 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
142 }
143 m_DeleteQueue.deleteAt(0);
144 m_pFTDialog->postCheckDeleteQueueMsg();
145 } else {
146 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
147 m_pWriter->writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
148 m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000149
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000150 char *pPath = m_DeleteQueue.getLocPathAt(0);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000151 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
152 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
153 }
154 }
155 } else {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000156 if (m_bFTDlgShown) {
157 m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
158 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
159 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
160 }
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000161 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000162}
163
164void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000165FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
166 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000167{
168 if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
169
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000170 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000171
172 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000173}
174
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000175bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000176FileTransfer::resizeSending()
177{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000178 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
179 unsigned int flags = m_TransferQueue.getFlagsAt(i);
180 if (flags & FT_ATTR_RESIZE_NEEDED) {
181 if (flags & FT_ATTR_FILE) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000182 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000183 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
184 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
185 } else {
186 if (flags & FT_ATTR_DIR) {
187 if (flags & FT_ATTR_COPY_DOWNLOAD) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000188 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000189 char *pPath = m_TransferQueue.getFullRemPathAt(i);
190 m_dirSizeRqstNum = i;
191 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
192 return false;
193 } else {
194 if (flags & FT_ATTR_COPY_UPLOAD) {
195 FolderManager fm;
196 DWORD64 dw64Size;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000197 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000198 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
199 m_dw64SizeSending += dw64Size;
200 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
201 }
202 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
203 } // if (flags & FT_ATTR_FOLDER)
204 } // if (flags & FT_ATTR_FILE)
205 } // if (flags & FT_ATTR_NEEDED_RESIZE)
206 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000207
208 if ((m_bFTDlgShown) && (m_bResized)) {
209 m_pFTDialog->m_pProgress->clearAndInitGeneral(m_dw64SizeSending, 0);
210 m_bResized = false;
211 }
212
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000213 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000214}
215
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000216void
217FileTransfer::checkTransferQueue()
218{
219 if (!isTransferEnable()) {
220 if (m_bFTDlgShown) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000221 m_pFTDialog->m_pProgress->clearAll();
222 m_dw64SizeSending = 0;
223 m_bResized = false;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000224 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000225 m_pFTDialog->afterCancelTransfer();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000226 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
227 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
228 return;
229 }
230 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000231 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000232
233 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000234
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000235 if (flag0 & FT_ATTR_COPY_UPLOAD) {
236 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000237 uploadFile();
238 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000239 }
240 if (flag0 & FT_ATTR_DIR) {
241 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
242 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
243 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
244
245 char *pPath = m_TransferQueue.getRemPathAt(0);
246 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
247 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000248 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000249 return;
250 }
251 } else {
252 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
253 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000254 downloadFile();
255 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000256 }
257 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000258 FolderManager fm;
259 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
260 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
261
262 if (!fm.createDir(pLocPath)) {
263 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
264 m_TransferQueue.deleteAt(0);
265 m_pFTDialog->postCheckTransferQueueMsg();
266 return;
267 } else {
268 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
269 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
270
271 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
272 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
273 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
274 m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000275 return;
276 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000277 }
278 }
279 }
280 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000281 } // if (!isTransferEnable())
282}
283
284bool
285FileTransfer::uploadFile()
286{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000287 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
288 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000289
290 if (m_bFTDlgShown) {
291 m_pFTDialog->setStatusText("Upload Started: %s to %s",
292 m_TransferQueue.getFullLocPathAt(0),
293 m_TransferQueue.getFullRemPathAt(0));
294 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
295 }
296
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000297 m_pWriter->writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
298 m_TransferQueue.getFullRemPathAt(0), 0);
299 uploadFilePortion();
300 }
301 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000302 return false;
303}
304
305bool
306FileTransfer::downloadFile()
307{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000308 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
309 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000310 if (m_bFTDlgShown) {
311 m_pFTDialog->setStatusText("Download Started: %s to %s",
312 m_TransferQueue.getFullRemPathAt(0),
313 m_TransferQueue.getFullLocPathAt(0));
314 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
315 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000316 m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
317 m_TransferQueue.getFullRemPathAt(0), 0);
318 return true;
319 } else return false;
320 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000321 return false;
322}
323
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000324void
325FileTransfer::uploadFilePortion()
326{
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000327 if (checkCancelOperations()) {
328 char reason[] = "The user cancel transfer";
329 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
330 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000331
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000332 if (m_fileReader.isCreated()) {
333 char buf[FT_MAX_SENDING_SIZE];
334 unsigned int bytesRead = 0;
335 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
336 if (bytesRead == 0) {
337 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
338 m_fileReader.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000339 if (m_bFTDlgShown) {
340 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000341 m_pFTDialog->setStatusText("Upload Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000342 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000343 m_TransferQueue.deleteAt(0);
344 m_pFTDialog->postCheckTransferQueueMsg();
345 } else {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000346 if (m_bFTDlgShown) m_pFTDialog->m_pProgress->increase(bytesRead);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000347 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
348 m_pFTDialog->postUploadFilePortionMsg();
349 }
350 } else {
351 m_fileReader.close();
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000352 char reason[] = "Error While Reading File";
353 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000354 if (m_bFTDlgShown) {
355 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
356 m_pFTDialog->setStatusText("Upload Failed");
357 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000358 m_TransferQueue.deleteAt(0);
359 m_pFTDialog->postCheckTransferQueueMsg();
360 }
361 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000362}
363
Dennis Syrovatskyf0928942005-12-14 15:12:45 +0000364void
365FileTransfer::createRemoteFolder(char *pPath, char *pName)
366{
367 char fullPath[FT_FILENAME_SIZE];
368 sprintf(fullPath, "%s\\%s", pPath, pName);
369 m_pFTDialog->setStatusText("Creating Remote Folder: %s", fullPath);
370 m_pWriter->writeFileCreateDirRqst(strlen(fullPath), fullPath);
371 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
372 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
373}
374
Dennis Syrovatsky95509432005-12-14 16:42:33 +0000375void
376FileTransfer::renameRemote(char *pPath, char *pOldName, char *pNewName)
377{
378 char fullOldName[FT_FILENAME_SIZE];
379 char fullNewName[FT_FILENAME_SIZE];
380
381 sprintf(fullOldName, "%s\\%s", pPath, pOldName);
382 sprintf(fullNewName, "%s\\%s", pPath, pNewName);
383
384 m_pWriter->writeFileRenameRqst(strlen(fullOldName), strlen(fullNewName),
385 fullOldName, fullNewName);
386 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
387 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
388}
389
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000390bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000391FileTransfer::procFileListDataMsg()
392{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000393 FileInfo fileInfo;
394 int res = m_pReader->readFileListData(&fileInfo);
395
396 bool bResult;
397 switch (m_queueFileListRqst.getFlagsAt(0))
398 {
399 case FT_FLR_DEST_MAIN:
400 if (!m_bFTDlgShown) break;
401
402 if (res < 0) {
403 m_pFTDialog->reqFolderUnavailable();
404 bResult = true;
405 } else {
406 bResult = procFLRMain(&fileInfo);
407 }
408 break;
409 case FT_FLR_DEST_BROWSE:
410 bResult = procFLRBrowse(&fileInfo);
411 break;
412 case FT_FLR_DEST_UPLOAD:
413 bResult = procFLRUpload(&fileInfo);
414 break;
415 case FT_FLR_DEST_DOWNLOAD:
416 bResult = procFLRDownload(&fileInfo);
417 break;
418 case FT_FLR_DEST_DELETE:
419 bResult = procFLRDelete(&fileInfo);
420 break;
421 case FT_FLR_DEST_RENAME:
422 bResult = procFLRRename(&fileInfo);
423 break;
424 }
425 m_queueFileListRqst.deleteAt(0);
426 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000427}
428
429bool
430FileTransfer::procFileDownloadDataMsg()
431{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000432 unsigned int bufSize = 0;
433 unsigned int modTime = 0;
434
435 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
436
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000437 if (checkCancelOperations()) {
438 char reason[] = "The user cancel transfer";
439 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
440 }
441
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000442 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
443 if (pFile != NULL) delete pFile;
444 return false;
445 }
446
447 if (bufSize > 0) {
448 unsigned int bytesWritten = 0;
449 m_fileWriter.write(pFile, bufSize, &bytesWritten);
450 delete pFile;
451 if (bytesWritten != bufSize) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000452 char reason[] = "Error File Writting to File";
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000453 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000454 if (m_bFTDlgShown) {
455 m_pFTDialog->setStatusText("Download Failed");
456 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
457 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000458 m_TransferQueue.deleteAt(0);
459 m_pFTDialog->postCheckTransferQueueMsg();
460 return false;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000461 } else {
462 if (m_bFTDlgShown) {
463 m_pFTDialog->m_pProgress->increase(bufSize);
464 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000465 }
466 return true;
467 } else {
468 if (modTime != 0) {
469 m_fileWriter.setTime(modTime);
470 m_fileWriter.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000471 if (m_bFTDlgShown) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000472 m_pFTDialog->setStatusText("Download Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000473 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
474 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000475 m_TransferQueue.deleteAt(0);
476 m_pFTDialog->postCheckTransferQueueMsg();
477 return true;
478 } else {
479 m_fileWriter.close();
480 char reason[] = "Error File Writting";
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000481 if (m_bFTDlgShown) {
482 m_pFTDialog->setStatusText("Download Failed");
483 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
484 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000485 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
486 m_TransferQueue.deleteAt(0);
487 m_pFTDialog->postCheckTransferQueueMsg();
488 }
489 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000490 return false;
491}
492
493bool
494FileTransfer::procFileUploadCancelMsg()
495{
496 return false;
497}
498
499bool
500FileTransfer::procFileDownloadFailedMsg()
501{
502 return false;
503}
504
505bool
506FileTransfer::procFileDirSizeDataMsg()
507{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000508 DWORD64 dw64DirSize = 0;
509 m_pReader->readFileDirSizeData(&dw64DirSize);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000510 m_dw64SizeSending += dw64DirSize;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000511 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000512 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000513 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000514}
515
516bool
517FileTransfer::procFileLastRqstFailedMsg()
518{
519 return false;
520}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000521
522bool
523FileTransfer::procFLRMain(FileInfo *pFI)
524{
525 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
526 return true;
527}
528
529bool
530FileTransfer::procFLRBrowse(FileInfo *pFI)
531{
532 return false;
533}
534
535bool
536FileTransfer::procFLRUpload(FileInfo *pFI)
537{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000538 unsigned int flags = m_TransferQueue.getFlagsAt(0);
539 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
540 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
541 if (num >= 0) {
542 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
543 m_pFTDialog->addRemoteLVItems(pFI);
544 }
545 } else {
546 if (flags & FT_ATTR_DIR) {
547 m_TransferQueue.deleteAt(0);
548 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
549 }
550 }
551 }
552 FolderManager fm;
553 FileInfo fi;
554 flags = m_TransferQueue.getFlagsAt(0);
555 if (flags & FT_ATTR_FILE) {
556 uploadFile();
557 return true;
558 } else {
559 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
560 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
561 m_TransferQueue.getFullRemPathAt(0),
562 &fi, FT_ATTR_COPY_UPLOAD);
563 }
564 }
565 m_TransferQueue.deleteAt(0);
566 m_pFTDialog->postCheckTransferQueueMsg();
567 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000568}
569
570bool
571FileTransfer::procFLRDownload(FileInfo *pFI)
572{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000573 unsigned int flags = m_TransferQueue.getFlagsAt(0);
574
575 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000576 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
577 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000578 pFI, FT_ATTR_COPY_DOWNLOAD);
579 m_TransferQueue.deleteAt(0);
580 m_pFTDialog->postCheckTransferQueueMsg();
581 return true;
582 } else {
583 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
584 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000585 return false;
586}
587
588bool
589FileTransfer::procFLRDelete(FileInfo *pFI)
590{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000591 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
592 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
593 } else {
594 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
595 }
596 m_DeleteQueue.deleteAt(0);
597 checkDeleteQueue();
598 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000599}
600
601bool
602FileTransfer::procFLRRename(FileInfo *pFI)
603{
604 return false;
605}
606
607void
608FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
609{
610 m_queueFileListRqst.add(pPath, 0, 0, dest);
611
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000612 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000613}
614
615int
616FileTransfer::isExistName(FileInfo *pFI, char *pName)
617{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000618 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000619 if (strcmp(pFI->getNameAt(i), pName) == 0) {
620 return i;
621 }
622 }
623 return -1;
624}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000625
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000626bool
627FileTransfer::checkCancelOperations()
628{
629 if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
630 if (m_bCancel) {
631 endUndoneOperation();
632 if (m_bFTDlgShown) {
633 m_pFTDialog->setStatusText("All Operations Canceled");
634 }
635 return true;
636 } else {
637 return false;
638 }
639}
640
641void
642FileTransfer::endUndoneOperation()
643{
644 m_bCancel = false;
645 m_fileReader.close();
646 m_fileWriter.close();
647 freeQueues();
648 m_dw64SizeSending = 0;
649 m_pFTDialog->m_pProgress->clearAll();
650}
651
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000652void
653FileTransfer::freeQueues()
654{
655 m_TransferQueue.free();
656 m_DeleteQueue.free();
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000657 m_queueFileListRqst.free();
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000658}