blob: 0a3009a98f11daed8843011df4000d95ff39811c [file] [log] [blame]
Dennis Syrovatsky139d7832005-11-02 05:36:05 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2 *
3 * This is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This software is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this software; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 * USA.
17 *
18 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
19 *
20 */
21
22// -=- FileTransfer.cxx
23
24#include <vncviewer/FileTransfer.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
29FileTransfer::FileTransfer()
30{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000031 m_bFTDlgShown = false;
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000032 m_bInitialized = false;
33
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000034 m_pFTDialog = new FTDialog(GetModuleHandle(0), this);
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000035
36 m_pReader = NULL;
37 m_pWriter = NULL;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +000038
39 m_dw64SizeSending = 0;
40 m_dirSizeRqstNum = 0;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000041}
42
43FileTransfer::~FileTransfer()
44{
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000045 if (m_pFTDialog != NULL) {
46 delete m_pFTDialog;
47 m_pFTDialog = NULL;
48 }
49}
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000050
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000051bool
52FileTransfer::initialize(rdr::InStream *pIS, rdr::OutStream *pOS)
53{
54 if (m_bInitialized) return false;
55
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000056 m_pReader = new FTMsgReader(pIS);
57 m_pWriter = new FTMsgWriter(pOS);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000058
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000059 m_TransferQueue.free();
60
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000061 m_bInitialized = true;
62 return true;
63}
64
65bool
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000066FileTransfer::show(HWND hwndParent)
Dennis Syrovatsky4ab41852005-11-07 09:52:36 +000067{
Dennis Syrovatskyda17d212005-11-09 05:58:30 +000068 if (!m_bInitialized) return false;
69
Dennis Syrovatsky4905c8f2005-11-21 15:52:46 +000070 m_bFTDlgShown = m_pFTDialog->createFTDialog(hwndParent);
Dennis Syrovatsky5c761172005-11-09 04:19:05 +000071 return m_bFTDlgShown;
Dennis Syrovatsky139d7832005-11-02 05:36:05 +000072}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000073
74bool
75FileTransfer::processFTMsg(int type)
76{
Dennis Syrovatsky514555b2005-11-21 14:40:56 +000077 if (!m_bInitialized) return false;
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000078
79 switch (type)
80 {
81 case msgTypeFileListData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000082 return procFileListDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000083 case msgTypeFileDownloadData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000084 return procFileDownloadDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000085 case msgTypeFileUploadCancel:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000086 return procFileUploadCancelMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000087 case msgTypeFileDownloadFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000088 return procFileDownloadFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000089 case msgTypeFileDirSizeData:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000090 return procFileDirSizeDataMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000091 case msgTypeFileLastRequestFailed:
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000092 return procFileLastRqstFailedMsg();
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000093 default:
94 return false;
95 }
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000096}
Dennis Syrovatsky63943a32005-11-10 06:24:56 +000097
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +000098bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +000099FileTransfer::isTransferEnable()
100{
101 if (m_TransferQueue.getNumEntries() > 0) return true; else return false;
102}
103
104void
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000105FileTransfer::addTransferQueue(char *pLocalPath, char *pRemotePath,
106 FileInfo *pFI, unsigned int flags)
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000107{
108 if ((m_bFTDlgShown) && (!isTransferEnable())) m_pFTDialog->setStatusText("Starting Copy Operation");
109
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000110 m_TransferQueue.add(pLocalPath, pRemotePath, pFI, (flags | FT_ATTR_RESIZE_NEEDED));
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000111
112 checkTransferQueue();
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000113}
114
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000115bool
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000116FileTransfer::resizeSending()
117{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000118 for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
119 unsigned int flags = m_TransferQueue.getFlagsAt(i);
120 if (flags & FT_ATTR_RESIZE_NEEDED) {
121 if (flags & FT_ATTR_FILE) {
122 m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
123 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
124 } else {
125 if (flags & FT_ATTR_DIR) {
126 if (flags & FT_ATTR_COPY_DOWNLOAD) {
127 char *pPath = m_TransferQueue.getFullRemPathAt(i);
128 m_dirSizeRqstNum = i;
129 m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
130 return false;
131 } else {
132 if (flags & FT_ATTR_COPY_UPLOAD) {
133 FolderManager fm;
134 DWORD64 dw64Size;
135 fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
136 m_dw64SizeSending += dw64Size;
137 m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
138 }
139 } // if (flags & FT_ATTR_COPY_DOWNLOAD)
140 } // if (flags & FT_ATTR_FOLDER)
141 } // if (flags & FT_ATTR_FILE)
142 } // if (flags & FT_ATTR_NEEDED_RESIZE)
143 } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
144 return true;
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000145}
146
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000147void
148FileTransfer::checkTransferQueue()
149{
150 if (!isTransferEnable()) {
151 if (m_bFTDlgShown) {
152 m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
153 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
154 PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
155 return;
156 }
157 } else {
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000158 if (!resizeSending()) return;
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000159
160 unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000161
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000162 if (flag0 & FT_ATTR_COPY_UPLOAD) {
163 if (flag0 & FT_ATTR_FILE) {
164 uploadFile();
165 return;
166 }
167 if (flag0 & FT_ATTR_DIR) {
168 char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
169 if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
170 m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
171
172 char *pPath = m_TransferQueue.getRemPathAt(0);
173 m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
174 m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
175 m_pWriter->writeFileListRqst(strlen(pPath), pPath, 0);
176 return;
177 }
178 } else {
179 if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
180 if (flag0 & FT_ATTR_FILE) {
181 }
182 if (flag0 & FT_ATTR_DIR) {
183 }
184 }
185 }
186 if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
187
188 } // if (!isTransferEnable())
189}
190
191bool
192FileTransfer::uploadFile()
193{
194 return false;
195}
196
197bool
198FileTransfer::downloadFile()
199{
200 return false;
201}
202
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000203void
204FileTransfer::uploadFilePortion()
205{
206
207}
208
209void
210FileTransfer::downloadFilePortion()
211{
212
213}
214
Dennis Syrovatsky6806fec2005-11-28 06:12:44 +0000215bool
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000216FileTransfer::procFileListDataMsg()
217{
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000218 FileInfo fileInfo;
219 int res = m_pReader->readFileListData(&fileInfo);
220
221 bool bResult;
222 switch (m_queueFileListRqst.getFlagsAt(0))
223 {
224 case FT_FLR_DEST_MAIN:
225 if (!m_bFTDlgShown) break;
226
227 if (res < 0) {
228 m_pFTDialog->reqFolderUnavailable();
229 bResult = true;
230 } else {
231 bResult = procFLRMain(&fileInfo);
232 }
233 break;
234 case FT_FLR_DEST_BROWSE:
235 bResult = procFLRBrowse(&fileInfo);
236 break;
237 case FT_FLR_DEST_UPLOAD:
238 bResult = procFLRUpload(&fileInfo);
239 break;
240 case FT_FLR_DEST_DOWNLOAD:
241 bResult = procFLRDownload(&fileInfo);
242 break;
243 case FT_FLR_DEST_DELETE:
244 bResult = procFLRDelete(&fileInfo);
245 break;
246 case FT_FLR_DEST_RENAME:
247 bResult = procFLRRename(&fileInfo);
248 break;
249 }
250 m_queueFileListRqst.deleteAt(0);
251 return bResult;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000252}
253
254bool
255FileTransfer::procFileDownloadDataMsg()
256{
257 return false;
258}
259
260bool
261FileTransfer::procFileUploadCancelMsg()
262{
263 return false;
264}
265
266bool
267FileTransfer::procFileDownloadFailedMsg()
268{
269 return false;
270}
271
272bool
273FileTransfer::procFileDirSizeDataMsg()
274{
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000275 DWORD64 dw64DirSize = 0;
276 m_pReader->readFileDirSizeData(&dw64DirSize);
277 m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000278 checkTransferQueue();
Dennis Syrovatskyc4ed9b72005-11-28 07:10:27 +0000279 return true;
Dennis Syrovatskyc08f0422005-11-10 06:36:46 +0000280}
281
282bool
283FileTransfer::procFileLastRqstFailedMsg()
284{
285 return false;
286}
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000287
288bool
289FileTransfer::procFLRMain(FileInfo *pFI)
290{
291 if (m_bFTDlgShown) m_pFTDialog->addRemoteLVItems(pFI);
292 return true;
293}
294
295bool
296FileTransfer::procFLRBrowse(FileInfo *pFI)
297{
298 return false;
299}
300
301bool
302FileTransfer::procFLRUpload(FileInfo *pFI)
303{
304 return false;
305}
306
307bool
308FileTransfer::procFLRDownload(FileInfo *pFI)
309{
310 return false;
311}
312
313bool
314FileTransfer::procFLRDelete(FileInfo *pFI)
315{
316 return false;
317}
318
319bool
320FileTransfer::procFLRRename(FileInfo *pFI)
321{
322 return false;
323}
324
325void
326FileTransfer::requestFileList(char *pPath, int dest, bool bDirOnly)
327{
328 m_queueFileListRqst.add(pPath, 0, 0, dest);
329
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000330 m_pWriter->writeFileListRqst(strlen(pPath), pPath, bDirOnly);
Dennis Syrovatsky8b194ee2005-11-10 08:56:34 +0000331}