blob: 01aae568f906ea2228fd422df3cc6105b767ad6c [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{
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000168 if (!isTransferEnable()) {
169 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Starting Copy Operation");
170 m_bTransferSuccess = true;
171 }
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000172
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000173 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000174
175 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000176}
177
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000178bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000179FileTransfer::resizeSending()
180{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000181 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
182 unsigned int flags = m_TransferQueue.getFlagsAt(i);
183 if (flags & FT_ATTR_RESIZE_NEEDED) {
184 if (flags & FT_ATTR_FILE) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000185 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000186 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
187 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
188 } else {
189 if (flags & FT_ATTR_DIR) {
190 if (flags & FT_ATTR_COPY_DOWNLOAD) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000191 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000192 char *pPath = m_TransferQueue.getFullRemPathAt(i);
193 m_dirSizeRqstNum = i;
194 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
195 return false;
196 } else {
197 if (flags & FT_ATTR_COPY_UPLOAD) {
198 FolderManager fm;
199 DWORD64 dw64Size;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000200 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000201 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
202 m_dw64SizeSending += dw64Size;
203 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
204 }
205 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
206 } // if (flags & FT_ATTR_FOLDER)
207 } // if (flags & FT_ATTR_FILE)
208 } // if (flags & FT_ATTR_NEEDED_RESIZE)
209 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000210
211 if ((m_bFTDlgShown) && (m_bResized)) {
212 m_pFTDialog->m_pProgress->clearAndInitGeneral(m_dw64SizeSending, 0);
213 m_bResized = false;
214 }
215
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000216 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000217}
218
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000219void
220FileTransfer::checkTransferQueue()
221{
222 if (!isTransferEnable()) {
223 if (m_bFTDlgShown) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000224 m_pFTDialog->m_pProgress->clearAll();
225 m_dw64SizeSending = 0;
226 m_bResized = false;
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000227
228 if (m_bTransferSuccess)
229 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
230 else
231 m_pFTDialog->setStatusText("File Transfer Operation Completed");
232
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000233 m_pFTDialog->afterCancelTransfer();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000234 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
235 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
236 return;
237 }
238 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000239 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000240
241 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000242
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000243 if (flag0 & FT_ATTR_COPY_UPLOAD) {
244 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000245 uploadFile();
246 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000247 }
248 if (flag0 & FT_ATTR_DIR) {
249 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
250 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
251 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
252
253 char *pPath = m_TransferQueue.getRemPathAt(0);
254 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
255 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000256 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000257 return;
258 }
259 } else {
260 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
261 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000262 downloadFile();
263 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000264 }
265 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000266 FolderManager fm;
267 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
268 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
269
270 if (!fm.createDir(pLocPath)) {
271 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000272 m_bTransferSuccess = false;
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000273 m_TransferQueue.deleteAt(0);
274 m_pFTDialog->postCheckTransferQueueMsg();
275 return;
276 } else {
277 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
278 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
279
280 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
281 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
282 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
283 m_pWriter->writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000284 return;
285 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000286 }
287 }
288 }
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000289 m_bTransferSuccess = false;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000290 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000291 } // if (!isTransferEnable())
292}
293
294bool
295FileTransfer::uploadFile()
296{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000297 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
298 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000299
300 if (m_bFTDlgShown) {
301 m_pFTDialog->setStatusText("Upload Started: %s to %s",
302 m_TransferQueue.getFullLocPathAt(0),
303 m_TransferQueue.getFullRemPathAt(0));
304 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
305 }
306
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000307 m_pWriter->writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
308 m_TransferQueue.getFullRemPathAt(0), 0);
309 uploadFilePortion();
310 }
311 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000312 return false;
313}
314
315bool
316FileTransfer::downloadFile()
317{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000318 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
319 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000320 if (m_bFTDlgShown) {
321 m_pFTDialog->setStatusText("Download Started: %s to %s",
322 m_TransferQueue.getFullRemPathAt(0),
323 m_TransferQueue.getFullLocPathAt(0));
324 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
325 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000326 m_pWriter->writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
327 m_TransferQueue.getFullRemPathAt(0), 0);
328 return true;
329 } else return false;
330 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000331 return false;
332}
333
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000334void
335FileTransfer::uploadFilePortion()
336{
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000337 if (checkCancelOperations()) {
338 char reason[] = "The user cancel transfer";
339 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
340 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000341
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000342 if (m_fileReader.isCreated()) {
343 char buf[FT_MAX_SENDING_SIZE];
344 unsigned int bytesRead = 0;
345 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
346 if (bytesRead == 0) {
347 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
348 m_fileReader.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000349 if (m_bFTDlgShown) {
350 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000351 m_pFTDialog->setStatusText("Upload Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000352 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000353 m_TransferQueue.deleteAt(0);
354 m_pFTDialog->postCheckTransferQueueMsg();
355 } else {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000356 if (m_bFTDlgShown) m_pFTDialog->m_pProgress->increase(bytesRead);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000357 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
358 m_pFTDialog->postUploadFilePortionMsg();
359 }
360 } else {
361 m_fileReader.close();
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000362 m_bTransferSuccess = false;
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000363 char reason[] = "Error While Reading File";
364 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000365 if (m_bFTDlgShown) {
366 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
367 m_pFTDialog->setStatusText("Upload Failed");
368 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000369 m_TransferQueue.deleteAt(0);
370 m_pFTDialog->postCheckTransferQueueMsg();
371 }
372 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000373}
374
Dennis Syrovatskyf0928942005-12-14 15:12:45 +0000375void
376FileTransfer::createRemoteFolder(char *pPath, char *pName)
377{
378 char fullPath[FT_FILENAME_SIZE];
379 sprintf(fullPath, "%s\\%s", pPath, pName);
380 m_pFTDialog->setStatusText("Creating Remote Folder: %s", fullPath);
381 m_pWriter->writeFileCreateDirRqst(strlen(fullPath), fullPath);
382 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
383 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
384}
385
Dennis Syrovatsky95509432005-12-14 16:42:33 +0000386void
387FileTransfer::renameRemote(char *pPath, char *pOldName, char *pNewName)
388{
389 char fullOldName[FT_FILENAME_SIZE];
390 char fullNewName[FT_FILENAME_SIZE];
391
392 sprintf(fullOldName, "%s\\%s", pPath, pOldName);
393 sprintf(fullNewName, "%s\\%s", pPath, pNewName);
394
395 m_pWriter->writeFileRenameRqst(strlen(fullOldName), strlen(fullNewName),
396 fullOldName, fullNewName);
397 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
398 m_pWriter->writeFileListRqst(strlen(pPath), pPath, false);
399}
400
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000401bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000402FileTransfer::procFileListDataMsg()
403{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000404 FileInfo fileInfo;
405 int res = m_pReader->readFileListData(&fileInfo);
406
407 bool bResult;
408 switch (m_queueFileListRqst.getFlagsAt(0))
409 {
410 case FT_FLR_DEST_MAIN:
411 if (!m_bFTDlgShown) break;
412
413 if (res < 0) {
414 m_pFTDialog->reqFolderUnavailable();
415 bResult = true;
416 } else {
417 bResult = procFLRMain(&fileInfo);
418 }
419 break;
420 case FT_FLR_DEST_BROWSE:
421 bResult = procFLRBrowse(&fileInfo);
422 break;
423 case FT_FLR_DEST_UPLOAD:
424 bResult = procFLRUpload(&fileInfo);
425 break;
426 case FT_FLR_DEST_DOWNLOAD:
427 bResult = procFLRDownload(&fileInfo);
428 break;
429 case FT_FLR_DEST_DELETE:
430 bResult = procFLRDelete(&fileInfo);
431 break;
432 case FT_FLR_DEST_RENAME:
433 bResult = procFLRRename(&fileInfo);
434 break;
435 }
436 m_queueFileListRqst.deleteAt(0);
437 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000438}
439
440bool
441FileTransfer::procFileDownloadDataMsg()
442{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000443 unsigned int bufSize = 0;
444 unsigned int modTime = 0;
445
446 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
447
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000448 if (checkCancelOperations()) {
449 char reason[] = "The user cancel transfer";
450 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
451 }
452
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000453 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000454 m_bTransferSuccess = false;
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000455 if (pFile != NULL) delete [] pFile;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000456 return false;
457 }
458
459 if (bufSize > 0) {
460 unsigned int bytesWritten = 0;
461 m_fileWriter.write(pFile, bufSize, &bytesWritten);
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000462 delete [] pFile;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000463 if (bytesWritten != bufSize) {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000464 m_bTransferSuccess = false;
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000465 char reason[] = "Error File Writting to File";
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000466 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000467 if (m_bFTDlgShown) {
468 m_pFTDialog->setStatusText("Download Failed");
469 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
470 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000471 m_TransferQueue.deleteAt(0);
472 m_pFTDialog->postCheckTransferQueueMsg();
473 return false;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000474 } else {
475 if (m_bFTDlgShown) {
476 m_pFTDialog->m_pProgress->increase(bufSize);
477 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000478 }
479 return true;
480 } else {
481 if (modTime != 0) {
482 m_fileWriter.setTime(modTime);
483 m_fileWriter.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000484 if (m_bFTDlgShown) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000485 m_pFTDialog->setStatusText("Download Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000486 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
487 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000488 m_TransferQueue.deleteAt(0);
489 m_pFTDialog->postCheckTransferQueueMsg();
490 return true;
491 } else {
492 m_fileWriter.close();
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000493 m_bTransferSuccess = false;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000494 char reason[] = "Error File Writting";
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000495 if (m_bFTDlgShown) {
496 m_pFTDialog->setStatusText("Download Failed");
497 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
498 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000499 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
500 m_TransferQueue.deleteAt(0);
501 m_pFTDialog->postCheckTransferQueueMsg();
502 }
503 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000504 return false;
505}
506
507bool
508FileTransfer::procFileUploadCancelMsg()
509{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000510 unsigned int reasonSize = 0;
511 char *pReason = m_pReader->readFileUploadCancel(&reasonSize);
512
513 if (m_bFTDlgShown) {
514 m_pFTDialog->setStatusText("Upload Canceled by Remote Computer : %s", pReason);
515 }
516 endUndoneOperation();
517 m_pFTDialog->postCheckTransferQueueMsg();
518
519 delete [] pReason;
520 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000521}
522
523bool
524FileTransfer::procFileDownloadFailedMsg()
525{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000526 unsigned int reasonSize = 0;
527 char *pReason = m_pReader->readFileDownloadFailed(&reasonSize);
528
529 if (m_bFTDlgShown) {
530 m_pFTDialog->setStatusText("Download Failed by Remote Computer : %s", pReason);
531 }
532 endUndoneOperation();
533 m_pFTDialog->postCheckTransferQueueMsg();
534
535 delete [] pReason;
536 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000537}
538
539bool
540FileTransfer::procFileDirSizeDataMsg()
541{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000542 DWORD64 dw64DirSize = 0;
543 m_pReader->readFileDirSizeData(&dw64DirSize);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000544 m_dw64SizeSending += dw64DirSize;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000545 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000546 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000547 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000548}
549
550bool
551FileTransfer::procFileLastRqstFailedMsg()
552{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000553 unsigned int reasonSize = 0;
554 int requestType;
555 char *pReason = m_pReader->readFileLastRqstFailed(&requestType, &reasonSize);
556 delete [] pReason;
557 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000558}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000559
560bool
561FileTransfer::procFLRMain(FileInfo *pFI)
562{
563 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
564 return true;
565}
566
567bool
568FileTransfer::procFLRBrowse(FileInfo *pFI)
569{
Dennis Syrovatskycbecfe12005-12-15 09:21:05 +0000570 m_pFTDialog->addBrowseItems(pFI);
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000571 return false;
572}
573
574bool
575FileTransfer::procFLRUpload(FileInfo *pFI)
576{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000577 unsigned int flags = m_TransferQueue.getFlagsAt(0);
578 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
579 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
580 if (num >= 0) {
581 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
582 m_pFTDialog->addRemoteLVItems(pFI);
583 }
584 } else {
585 if (flags & FT_ATTR_DIR) {
586 m_TransferQueue.deleteAt(0);
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000587 m_bTransferSuccess = false;
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000588 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
589 }
590 }
591 }
592 FolderManager fm;
593 FileInfo fi;
594 flags = m_TransferQueue.getFlagsAt(0);
595 if (flags & FT_ATTR_FILE) {
596 uploadFile();
597 return true;
598 } else {
599 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
600 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
601 m_TransferQueue.getFullRemPathAt(0),
602 &fi, FT_ATTR_COPY_UPLOAD);
603 }
604 }
605 m_TransferQueue.deleteAt(0);
606 m_pFTDialog->postCheckTransferQueueMsg();
607 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000608}
609
610bool
611FileTransfer::procFLRDownload(FileInfo *pFI)
612{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000613 unsigned int flags = m_TransferQueue.getFlagsAt(0);
614
615 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000616 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
617 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000618 pFI, FT_ATTR_COPY_DOWNLOAD);
619 m_TransferQueue.deleteAt(0);
620 m_pFTDialog->postCheckTransferQueueMsg();
621 return true;
622 } else {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000623 m_bTransferSuccess = false;
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000624 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
625 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000626 return false;
627}
628
629bool
630FileTransfer::procFLRDelete(FileInfo *pFI)
631{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000632 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
633 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
634 } else {
635 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
636 }
637 m_DeleteQueue.deleteAt(0);
638 checkDeleteQueue();
639 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000640}
641
642bool
643FileTransfer::procFLRRename(FileInfo *pFI)
644{
645 return false;
646}
647
648void
649FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
650{
651 m_queueFileListRqst.add(pPath, 0, 0, dest);
652
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000653 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000654}
655
656int
657FileTransfer::isExistName(FileInfo *pFI, char *pName)
658{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000659 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000660 if (strcmp(pFI->getNameAt(i), pName) == 0) {
661 return i;
662 }
663 }
664 return -1;
665}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000666
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000667bool
668FileTransfer::checkCancelOperations()
669{
670 if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
671 if (m_bCancel) {
672 endUndoneOperation();
673 if (m_bFTDlgShown) {
674 m_pFTDialog->setStatusText("All Operations Canceled");
675 }
676 return true;
677 } else {
678 return false;
679 }
680}
681
682void
683FileTransfer::endUndoneOperation()
684{
685 m_bCancel = false;
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000686 m_bTransferSuccess = false;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000687 m_fileReader.close();
688 m_fileWriter.close();
689 freeQueues();
690 m_dw64SizeSending = 0;
691 m_pFTDialog->m_pProgress->clearAll();
692}
693
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000694void
695FileTransfer::freeQueues()
696{
697 m_TransferQueue.free();
698 m_DeleteQueue.free();
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000699 m_queueFileListRqst.free();
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000700}