blob: 46d4799adfd6310bfad4ceabf1c44d70e46d28a6 [file] [log] [blame]
Dennis Syrovatsky139d7832005-11-02 05:36:05 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +00002 *
3 * Developed by Dennis Syrovatsky.
Dennis Syrovatsky139d7832005-11-02 05:36:05 +00004 *
5 * This is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This software is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this software; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
18 * USA.
19 *
20 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
21 *
22 */
23
24// -=- FileTransfer.cxx
25
26#include <vncviewer/FileTransfer.h>
27
28using namespace rfb;
29using namespace rfb::win32;
30
31FileTransfer::FileTransfer()
32{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000033 m_bFTDlgShown = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000034 m_bInitialized = false;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +000035 m_bResized = false;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +000036 m_bCancel = false;
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +000037 m_bOverwriteAll = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000038
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000039 m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000040
41 m_pReader = NULL;
42 m_pWriter = NULL;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +000043
44 m_dw64SizeSending = 0;
45 m_dirSizeRqstNum = 0;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000046}
47
48FileTransfer::~FileTransfer()
49{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000050 if (m_pFTDialog != NULL) {
51 delete m_pFTDialog;
52 m_pFTDialog = NULL;
53 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000054
Dennis Syrovatsky1f868512005-12-14 07:38:19 +000055 if (m_pReader != NULL) {
56 delete m_pReader;
57 m_pReader = NULL;
58 }
59
60 if (m_pWriter != NULL) {
61 delete m_pWriter;
62 m_pWriter = NULL;
63 }
64
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000065 freeQueues();
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000066}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000067
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000068bool
69FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
70{
71 if (m_bInitialized) return false;
72
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +000073 m_pReader = new CFTMsgReader(pIS);
74 m_pWriter = new CFTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000075
Dennis Syrovatsky29440e82005-12-05 09:31:28 +000076 freeQueues();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000077
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000078 m_bInitialized = true;
79 return true;
80}
81
82bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000083FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000084{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000085 if (!m_bInitialized) return false;
86
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000087 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +000088
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000089 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000090}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000091
92bool
93FileTransfer::processFTMsg(int type)
94{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000095 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000096
97 switch (type)
98 {
99 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000100 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000101 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000102 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000103 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000104 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000105 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000106 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000107 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000108 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000109 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000110 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000111 default:
112 return false;
113 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000114}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +0000115
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000116bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000117FileTransfer::isTransferEnable()
118{
119 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
120}
121
122void
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000123FileTransfer::addDeleteQueue(char *pPathPrefix, FileInfo *pFI, unsigned int flags)
124{
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000125 if ((m_bFTDlgShown) && (m_DeleteQueue.getNumEntries() > 0))
126 m_pFTDialog->setStatusText("Starting Delete Operation");
127
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000128 m_DeleteQueue.add(pPathPrefix, pPathPrefix, pFI, flags);
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000129
130 checkDeleteQueue();
131}
132
133void
134FileTransfer::checkDeleteQueue()
135{
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000136 if (m_DeleteQueue.getNumEntries() > 0) {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000137 if (m_bFTDlgShown)
138 m_pFTDialog->setStatusText("Delete Operation Executing: %s", m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000139 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_LOCAL) {
140 FolderManager fm;
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000141 if (!fm.deleteIt(m_DeleteQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000142 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed");
143 } else {
144 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed");
145 }
146 m_DeleteQueue.deleteAt(0);
147 m_pFTDialog->postCheckDeleteQueueMsg();
148 } else {
149 if (m_DeleteQueue.getFlagsAt(0) & FT_ATTR_DELETE_REMOTE) {
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000150 writeFileDeleteRqst(strlen(m_DeleteQueue.getFullLocPathAt(0)),
151 m_DeleteQueue.getFullLocPathAt(0));
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000152
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000153 char *pPath = m_DeleteQueue.getLocPathAt(0);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000154 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_DELETE);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000155 writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000156 }
157 }
158 } else {
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000159 if (m_bFTDlgShown) {
160 m_pFTDialog->setStatusText("Delete Operation Completed Successfully");
161 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
162 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
163 }
Dennis Syrovatsky092d9982005-12-05 09:57:05 +0000164 }
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000165}
166
167void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000168FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
169 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000170{
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000171 if (!isTransferEnable()) {
172 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Starting Copy Operation");
173 m_bTransferSuccess = true;
174 }
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000175
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000176 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000177
178 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000179}
180
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000181bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000182FileTransfer::resizeSending()
183{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000184 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
185 unsigned int flags = m_TransferQueue.getFlagsAt(i);
186 if (flags & FT_ATTR_RESIZE_NEEDED) {
187 if (flags & FT_ATTR_FILE) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000188 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000189 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
190 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
191 } else {
192 if (flags & FT_ATTR_DIR) {
193 if (flags & FT_ATTR_COPY_DOWNLOAD) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000194 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000195 char *pPath = m_TransferQueue.getFullRemPathAt(i);
196 m_dirSizeRqstNum = i;
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000197 writeFileDirSizeRqst(strlen(pPath), pPath);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000198 return false;
199 } else {
200 if (flags & FT_ATTR_COPY_UPLOAD) {
201 FolderManager fm;
202 DWORD64 dw64Size;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000203 m_bResized = true;
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000204 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
205 m_dw64SizeSending += dw64Size;
206 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
207 }
208 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
209 } // if (flags & FT_ATTR_FOLDER)
210 } // if (flags & FT_ATTR_FILE)
211 } // if (flags & FT_ATTR_NEEDED_RESIZE)
212 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000213
214 if ((m_bFTDlgShown) && (m_bResized)) {
215 m_pFTDialog->m_pProgress->clearAndInitGeneral(m_dw64SizeSending, 0);
216 m_bResized = false;
217 }
218
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000219 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000220}
221
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000222void
223FileTransfer::checkTransferQueue()
224{
225 if (!isTransferEnable()) {
226 if (m_bFTDlgShown) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000227 m_pFTDialog->m_pProgress->clearAll();
228 m_dw64SizeSending = 0;
229 m_bResized = false;
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000230
231 if (m_bTransferSuccess)
232 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
233 else
234 m_pFTDialog->setStatusText("File Transfer Operation Completed");
235
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000236 m_pFTDialog->afterCancelTransfer();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000237 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
238 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
239 return;
240 }
241 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000242 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000243
244 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000245
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000246 if (flag0 & FT_ATTR_COPY_UPLOAD) {
247 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000248 uploadFile();
249 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000250 }
251 if (flag0 & FT_ATTR_DIR) {
252 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
253 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000254 writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000255
256 char *pPath = m_TransferQueue.getRemPathAt(0);
257 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
258 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000259 writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000260 return;
261 }
262 } else {
263 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
264 if (flag0 & FT_ATTR_FILE) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000265 downloadFile();
266 return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000267 }
268 if (flag0 & FT_ATTR_DIR) {
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000269 FolderManager fm;
270 char *pLocPath = m_TransferQueue.getFullLocPathAt(0);
271 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder. %s", pLocPath);
272
273 if (!fm.createDir(pLocPath)) {
274 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Local Folder Failed.");
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000275 m_bTransferSuccess = false;
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000276 m_TransferQueue.deleteAt(0);
277 m_pFTDialog->postCheckTransferQueueMsg();
278 return;
279 } else {
280 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getLocPathAt(0), m_pFTDialog->getLocalPath()) == 0))
281 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
282
283 m_TransferQueue.setFlagsAt(0, (m_TransferQueue.getFlagsAt(0) | FT_ATTR_FLR_DOWNLOAD_ADD));
284 char *pRemPath = m_TransferQueue.getFullRemPathAt(0);
285 m_queueFileListRqst.add(pRemPath, 0, 0, FT_FLR_DEST_DOWNLOAD);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000286 writeFileListRqst(strlen(pRemPath), pRemPath, 0);
Dennis Syrovatsky3f5ccbd2005-12-13 04:33:07 +0000287 return;
288 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000289 }
290 }
291 }
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000292 m_bTransferSuccess = false;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000293 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000294 } // if (!isTransferEnable())
295}
296
297bool
298FileTransfer::uploadFile()
299{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000300 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
301 if (m_fileReader.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000302
303 if (m_bFTDlgShown) {
304 m_pFTDialog->setStatusText("Upload Started: %s to %s",
305 m_TransferQueue.getFullLocPathAt(0),
306 m_TransferQueue.getFullRemPathAt(0));
307 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
308 }
309
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000310 writeFileUploadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
311 m_TransferQueue.getFullRemPathAt(0), 0);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000312 uploadFilePortion();
313 }
314 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000315 return false;
316}
317
318bool
319FileTransfer::downloadFile()
320{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000321 if (m_TransferQueue.getFlagsAt(0) & FT_ATTR_FILE) {
322 if (m_fileWriter.create(m_TransferQueue.getFullLocPathAt(0))) {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000323 if (m_bFTDlgShown) {
324 m_pFTDialog->setStatusText("Download Started: %s to %s",
325 m_TransferQueue.getFullRemPathAt(0),
326 m_TransferQueue.getFullLocPathAt(0));
327 m_pFTDialog->m_pProgress->clearAndInitSingle(m_TransferQueue.getSizeAt(0), 0);
328 }
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000329 writeFileDownloadRqst(strlen(m_TransferQueue.getFullRemPathAt(0)),
330 m_TransferQueue.getFullRemPathAt(0), 0);
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000331 return true;
332 } else return false;
333 }
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000334 return false;
335}
336
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000337void
338FileTransfer::uploadFilePortion()
339{
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000340 if (checkCancelOperations()) {
341 char reason[] = "The user cancel transfer";
342 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
343 }
Dennis Syrovatsky7b53c662005-12-14 10:18:21 +0000344
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000345 if (m_fileReader.isCreated()) {
346 char buf[FT_MAX_SENDING_SIZE];
347 unsigned int bytesRead = 0;
348 if (m_fileReader.read((void *)buf, FT_MAX_SENDING_SIZE, &bytesRead)) {
349 if (bytesRead == 0) {
350 m_pWriter->writeFileUploadData(m_TransferQueue.getDataAt(0));
351 m_fileReader.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000352 if (m_bFTDlgShown) {
353 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000354 m_pFTDialog->setStatusText("Upload Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000355 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000356 m_TransferQueue.deleteAt(0);
357 m_pFTDialog->postCheckTransferQueueMsg();
358 } else {
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000359 if (m_bFTDlgShown) m_pFTDialog->m_pProgress->increase(bytesRead);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000360 m_pWriter->writeFileUploadData(bytesRead, (char *)buf);
361 m_pFTDialog->postUploadFilePortionMsg();
362 }
363 } else {
364 m_fileReader.close();
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000365 m_bTransferSuccess = false;
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000366 char reason[] = "Error While Reading File";
367 m_pWriter->writeFileUploadFailed(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000368 if (m_bFTDlgShown) {
369 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
370 m_pFTDialog->setStatusText("Upload Failed");
371 }
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000372 m_TransferQueue.deleteAt(0);
373 m_pFTDialog->postCheckTransferQueueMsg();
374 }
375 }
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000376}
377
Dennis Syrovatskyf0928942005-12-14 15:12:45 +0000378void
379FileTransfer::createRemoteFolder(char *pPath, char *pName)
380{
381 char fullPath[FT_FILENAME_SIZE];
382 sprintf(fullPath, "%s\\%s", pPath, pName);
383 m_pFTDialog->setStatusText("Creating Remote Folder: %s", fullPath);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000384 writeFileCreateDirRqst(strlen(fullPath), fullPath);
Dennis Syrovatskyf0928942005-12-14 15:12:45 +0000385 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000386 writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatskyf0928942005-12-14 15:12:45 +0000387}
388
Dennis Syrovatsky95509432005-12-14 16:42:33 +0000389void
390FileTransfer::renameRemote(char *pPath, char *pOldName, char *pNewName)
391{
392 char fullOldName[FT_FILENAME_SIZE];
393 char fullNewName[FT_FILENAME_SIZE];
394
395 sprintf(fullOldName, "%s\\%s", pPath, pOldName);
396 sprintf(fullNewName, "%s\\%s", pPath, pNewName);
397
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000398 writeFileRenameRqst(strlen(fullOldName), strlen(fullNewName),
399 fullOldName, fullNewName);
Dennis Syrovatsky95509432005-12-14 16:42:33 +0000400 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_MAIN);
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000401 writeFileListRqst(strlen(pPath), pPath, false);
Dennis Syrovatsky95509432005-12-14 16:42:33 +0000402}
403
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000404bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000405FileTransfer::procFileListDataMsg()
406{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000407 FileInfo fileInfo;
408 int res = m_pReader->readFileListData(&fileInfo);
409
410 bool bResult;
411 switch (m_queueFileListRqst.getFlagsAt(0))
412 {
413 case FT_FLR_DEST_MAIN:
414 if (!m_bFTDlgShown) break;
415
416 if (res < 0) {
417 m_pFTDialog->reqFolderUnavailable();
418 bResult = true;
419 } else {
420 bResult = procFLRMain(&fileInfo);
421 }
422 break;
423 case FT_FLR_DEST_BROWSE:
424 bResult = procFLRBrowse(&fileInfo);
425 break;
426 case FT_FLR_DEST_UPLOAD:
427 bResult = procFLRUpload(&fileInfo);
428 break;
429 case FT_FLR_DEST_DOWNLOAD:
430 bResult = procFLRDownload(&fileInfo);
431 break;
432 case FT_FLR_DEST_DELETE:
433 bResult = procFLRDelete(&fileInfo);
434 break;
435 case FT_FLR_DEST_RENAME:
436 bResult = procFLRRename(&fileInfo);
437 break;
438 }
439 m_queueFileListRqst.deleteAt(0);
440 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000441}
442
443bool
444FileTransfer::procFileDownloadDataMsg()
445{
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000446 unsigned int bufSize = 0;
447 unsigned int modTime = 0;
448
449 void *pFile = m_pReader->readFileDownloadData(&bufSize, &modTime);
450
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000451 if (checkCancelOperations()) {
452 char reason[] = "The user cancel transfer";
453 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
454 }
455
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000456 if ((!m_fileWriter.isCreated()) || (!isTransferEnable())) {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000457 m_bTransferSuccess = false;
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000458 if (pFile != NULL) delete [] pFile;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000459 return false;
460 }
461
462 if (bufSize > 0) {
463 unsigned int bytesWritten = 0;
464 m_fileWriter.write(pFile, bufSize, &bytesWritten);
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000465 delete [] pFile;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000466 if (bytesWritten != bufSize) {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000467 m_bTransferSuccess = false;
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000468 char reason[] = "Error File Writting to File";
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000469 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000470 if (m_bFTDlgShown) {
471 m_pFTDialog->setStatusText("Download Failed");
472 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
473 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000474 m_TransferQueue.deleteAt(0);
475 m_pFTDialog->postCheckTransferQueueMsg();
476 return false;
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000477 } else {
478 if (m_bFTDlgShown) {
479 m_pFTDialog->m_pProgress->increase(bufSize);
480 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000481 }
482 return true;
483 } else {
484 if (modTime != 0) {
485 m_fileWriter.setTime(modTime);
486 m_fileWriter.close();
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000487 if (m_bFTDlgShown) {
Dennis Syrovatsky95a01ff2005-12-14 07:58:29 +0000488 m_pFTDialog->setStatusText("Download Completed");
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000489 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
490 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000491 m_TransferQueue.deleteAt(0);
492 m_pFTDialog->postCheckTransferQueueMsg();
493 return true;
494 } else {
495 m_fileWriter.close();
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000496 m_bTransferSuccess = false;
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000497 char reason[] = "Error File Writting";
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000498 if (m_bFTDlgShown) {
499 m_pFTDialog->setStatusText("Download Failed");
500 m_pFTDialog->m_pProgress->clearAndInitSingle(0, 0);
501 }
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000502 m_pWriter->writeFileDownloadCancel(strlen(reason), reason);
503 m_TransferQueue.deleteAt(0);
504 m_pFTDialog->postCheckTransferQueueMsg();
505 }
506 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000507 return false;
508}
509
510bool
511FileTransfer::procFileUploadCancelMsg()
512{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000513 unsigned int reasonSize = 0;
514 char *pReason = m_pReader->readFileUploadCancel(&reasonSize);
515
516 if (m_bFTDlgShown) {
517 m_pFTDialog->setStatusText("Upload Canceled by Remote Computer : %s", pReason);
518 }
519 endUndoneOperation();
520 m_pFTDialog->postCheckTransferQueueMsg();
521
522 delete [] pReason;
523 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000524}
525
526bool
527FileTransfer::procFileDownloadFailedMsg()
528{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000529 unsigned int reasonSize = 0;
530 char *pReason = m_pReader->readFileDownloadFailed(&reasonSize);
531
532 if (m_bFTDlgShown) {
533 m_pFTDialog->setStatusText("Download Failed by Remote Computer : %s", pReason);
534 }
535 endUndoneOperation();
536 m_pFTDialog->postCheckTransferQueueMsg();
537
538 delete [] pReason;
539 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000540}
541
542bool
543FileTransfer::procFileDirSizeDataMsg()
544{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000545 DWORD64 dw64DirSize = 0;
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000546 unsigned short dirSizeLow16 = 0;
547 unsigned int dirSizeHigh32 = 0;
548 m_pReader->readFileDirSizeData(&dirSizeLow16, &dirSizeHigh32);
549
550 dw64DirSize = dirSizeLow16;
551 dw64DirSize = (dw64DirSize << 32) + dirSizeHigh32;
552
Dennis Syrovatsky4ad60072005-12-14 08:48:16 +0000553 m_dw64SizeSending += dw64DirSize;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000554 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000555 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000556 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000557}
558
559bool
560FileTransfer::procFileLastRqstFailedMsg()
561{
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000562 unsigned int reasonSize = 0;
563 int requestType;
564 char *pReason = m_pReader->readFileLastRqstFailed(&requestType, &reasonSize);
565 delete [] pReason;
566 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000567}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000568
569bool
570FileTransfer::procFLRMain(FileInfo *pFI)
571{
572 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
573 return true;
574}
575
576bool
577FileTransfer::procFLRBrowse(FileInfo *pFI)
578{
Dennis Syrovatskycbecfe12005-12-15 09:21:05 +0000579 m_pFTDialog->addBrowseItems(pFI);
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000580 return false;
581}
582
583bool
584FileTransfer::procFLRUpload(FileInfo *pFI)
585{
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000586 unsigned int flags = m_TransferQueue.getFlagsAt(0);
587 if (flags & FT_ATTR_FLR_UPLOAD_CHECK) {
588 int num = isExistName(pFI, m_TransferQueue.getRemNameAt(0));
589 if (num >= 0) {
590 if ((m_bFTDlgShown) && (strcmp(m_TransferQueue.getRemPathAt(0), m_pFTDialog->getRemotePath()) == 0)) {
591 m_pFTDialog->addRemoteLVItems(pFI);
592 }
593 } else {
594 if (flags & FT_ATTR_DIR) {
595 m_TransferQueue.deleteAt(0);
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000596 m_bTransferSuccess = false;
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000597 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Create Remote Folder Failed.");
598 }
599 }
600 }
601 FolderManager fm;
602 FileInfo fi;
603 flags = m_TransferQueue.getFlagsAt(0);
604 if (flags & FT_ATTR_FILE) {
605 uploadFile();
606 return true;
607 } else {
608 if (fm.getDirInfo(m_TransferQueue.getFullLocPathAt(0), &fi, 0)) {
609 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
610 m_TransferQueue.getFullRemPathAt(0),
611 &fi, FT_ATTR_COPY_UPLOAD);
612 }
613 }
614 m_TransferQueue.deleteAt(0);
615 m_pFTDialog->postCheckTransferQueueMsg();
616 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000617}
618
619bool
620FileTransfer::procFLRDownload(FileInfo *pFI)
621{
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000622 unsigned int flags = m_TransferQueue.getFlagsAt(0);
623
624 if ((flags & FT_ATTR_DIR) && (flags & FT_ATTR_FLR_DOWNLOAD_ADD)) {
Dennis Syrovatsky0eb0da42005-12-14 06:35:43 +0000625 m_TransferQueue.add(m_TransferQueue.getFullLocPathAt(0),
626 m_TransferQueue.getFullRemPathAt(0),
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000627 pFI, FT_ATTR_COPY_DOWNLOAD);
628 m_TransferQueue.deleteAt(0);
629 m_pFTDialog->postCheckTransferQueueMsg();
630 return true;
631 } else {
Dennis Syrovatskyf8f977d2005-12-18 07:39:47 +0000632 m_bTransferSuccess = false;
Dennis Syrovatskya2120432005-12-13 04:40:50 +0000633 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed: Unknown data from server.");
634 }
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000635 return false;
636}
637
638bool
639FileTransfer::procFLRDelete(FileInfo *pFI)
640{
Dennis Syrovatsky922ee6a2005-12-05 10:55:51 +0000641 if (isExistName(pFI, m_DeleteQueue.getLocNameAt(0)) >= 0) {
642 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Failed.");
643 } else {
644 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Delete Operation Completed.");
645 }
646 m_DeleteQueue.deleteAt(0);
647 checkDeleteQueue();
648 return true;
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000649}
650
651bool
652FileTransfer::procFLRRename(FileInfo *pFI)
653{
654 return false;
655}
656
657void
658FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
659{
660 m_queueFileListRqst.add(pPath, 0, 0, dest);
661
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000662 writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000663}
664
665int
666FileTransfer::isExistName(FileInfo *pFI, char *pName)
667{
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000668 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
Dennis Syrovatsky5ae73f12005-11-30 04:15:40 +0000669 if (strcmp(pFI->getNameAt(i), pName) == 0) {
670 return i;
671 }
672 }
673 return -1;
674}
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000675
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000676bool
677FileTransfer::checkCancelOperations()
678{
679 if (m_bFTDlgShown) m_pFTDialog->processDlgMsgs();
680 if (m_bCancel) {
681 endUndoneOperation();
682 if (m_bFTDlgShown) {
683 m_pFTDialog->setStatusText("All Operations Canceled");
684 }
685 return true;
686 } else {
687 return false;
688 }
689}
690
691void
692FileTransfer::endUndoneOperation()
693{
694 m_bCancel = false;
Dennis Syrovatskyafb285f2005-12-18 09:10:43 +0000695 m_bTransferSuccess = false;
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000696 m_fileReader.close();
697 m_fileWriter.close();
698 freeQueues();
699 m_dw64SizeSending = 0;
700 m_pFTDialog->m_pProgress->clearAll();
701}
702
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000703void
704FileTransfer::freeQueues()
705{
706 m_TransferQueue.free();
707 m_DeleteQueue.free();
Dennis Syrovatsky2142b4a2005-12-14 11:03:19 +0000708 m_queueFileListRqst.free();
Dennis Syrovatsky29440e82005-12-05 09:31:28 +0000709}
Dennis Syrovatskyf72f9fd2006-04-17 08:56:48 +0000710
711int
712FileTransfer::convertToUnixPath(char *path)
713{
714 int len = strlen(path);
715 if (len >= FT_FILENAME_SIZE) return -1;
716 if (len == 0) {strcpy(path, "/"); return 1;}
717 for (int i = (len - 1); i >= 0; i--) {
718 if (path[i] == '\\') path[i] = '/';
719 path[i+1] = path[i];
720 }
721 path[len + 1] = '\0';
722 path[0] = '/';
723 return strlen(path);
724}
725
726bool
727FileTransfer::writeFileListRqst(unsigned short dirnameLen, char *pDirName, bool bDirOnly)
728{
729 char dirName[FT_FILENAME_SIZE];
730 strcpy(dirName, pDirName);
731 int len = convertToUnixPath(dirName);
732 if (len <= 0) return false;
733
734 return m_pWriter->writeFileListRqst(len, dirName, bDirOnly);
735}
736
737bool
738FileTransfer::writeFileDownloadRqst(unsigned short filenameLen, char *pFilename,
739 unsigned int position)
740{
741 char filename[FT_FILENAME_SIZE];
742 strcpy(filename, pFilename);
743 unsigned short len = (unsigned short) convertToUnixPath(filename);
744 if (len <= 0) return false;
745
746 return m_pWriter->writeFileDownloadRqst(len, filename, position);
747}
748
749bool
750FileTransfer::writeFileUploadRqst(unsigned short filenameLen, char *pFilename,
751 unsigned int position)
752{
753 char filename[FT_FILENAME_SIZE];
754 strcpy(filename, pFilename);
755 unsigned short len = (unsigned short) convertToUnixPath(filename);
756 if (len <= 0) return false;
757
758 return m_pWriter->writeFileUploadRqst(len, filename, position);
759}
760
761bool
762FileTransfer::writeFileCreateDirRqst(unsigned short dirNameLen, char *pDirName)
763{
764 char path[FT_FILENAME_SIZE];
765 strcpy(path, pDirName);
766 int nameLen = convertToUnixPath(path);
767
768 return m_pWriter->writeFileCreateDirRqst(nameLen, path);
769}
770
771bool
772FileTransfer::writeFileDirSizeRqst(unsigned short dirNameLen, char *pDirName)
773{
774 char path[FT_FILENAME_SIZE];
775 strcpy(path, pDirName);
776 int nameLen = convertToUnixPath(path);
777
778 return m_pWriter->writeFileDirSizeRqst(nameLen, path);
779}
780
781bool
782FileTransfer::writeFileRenameRqst(unsigned short oldNameLen, unsigned short newNameLen,
783 char *pOldName, char *pNewName)
784{
785 char oldName[FT_FILENAME_SIZE];
786 char newName[FT_FILENAME_SIZE];
787
788 strcpy(oldName, pOldName);
789 strcpy(newName, pNewName);
790
791 int _oldNameLen = convertToUnixPath(oldName);
792 int _newNameLen = convertToUnixPath(newName);
793
794 return m_pWriter->writeFileRenameRqst(_oldNameLen, _newNameLen, oldName, newName);
795}
796
797bool
798FileTransfer::writeFileDeleteRqst(unsigned short nameLen, char *pName)
799{
800 char path[FT_FILENAME_SIZE];
801 strcpy(path, pName);
802 int _nameLen = convertToUnixPath(path);
803
804 return m_pWriter->writeFileDeleteRqst(_nameLen, path);
805}