blob: fe4e9afcf4ca889deba4b08ce5b479286f36fb01 [file] [log] [blame]
Constantin Kaplinsky4a1f6952006-05-19 10:09:44 +00001/* Copyright (C) 2006 TightVNC Team. All Rights Reserved.
2 *
3 * Developed by Dennis Syrovatsky
4 *
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// -=- SFileTransfer.cxx
25
26#include <rfb/msgTypes.h>
27#include <rfb/SFileTransfer.h>
28
29using namespace rfb;
30
31SFileTransfer::SFileTransfer(network::Socket *sock) :
Constantin Kaplinsky21882422006-05-19 11:13:04 +000032 m_bUploadStarted(false), m_bDownloadStarted(false),
33 m_reader(&sock->inStream()), m_writer(&sock->outStream()), m_pSocket(sock)
Constantin Kaplinsky4a1f6952006-05-19 10:09:44 +000034{
35}
36
37SFileTransfer::~SFileTransfer()
38{
39}
40
41bool
42SFileTransfer::processMessages(int type)
43{
44 switch(type)
45 {
46 case msgTypeFileListRequest:
47 return processFileListRequest();
48 case msgTypeFileDownloadRequest:
49 return processFileDownloadRequest();
50 case msgTypeFileUploadRequest:
51 return processFileUploadRequest();
52 case msgTypeFileUploadData:
53 return processFileUploadData();
54 case msgTypeFileDownloadCancel:
55 return processFileDownloadCancel();
56 case msgTypeFileUploadFailed:
57 return processFileUploadFailed();
58 case msgTypeFileCreateDirRequest:
59 return processFileCreateDirRequest();
60 case msgTypeFileDirSizeRequest:
61 return processFileDirSizeRequest();
62 case msgTypeFileRenameRequest:
63 return processFileRenameRequest();
64 case msgTypeFileDeleteRequest:
65 return processFileDeleteRequest();
66 default:
67 return false;
68 }
69}
70
71bool
72SFileTransfer::processFileListRequest()
73{
74 char szDirName[FT_FILENAME_SIZE] = {0};
75 unsigned int dirNameSize = FT_FILENAME_SIZE;
76 unsigned int flags = 0;
77
78 if (!m_reader.readFileListRqst(&dirNameSize, szDirName, &flags)) return false;
79
80 if (!convertPathFromNet(szDirName)) return false;
81
82 bool bDirOnly = false;
83 if (flags & 0x10) bDirOnly = true;
84
85 FileInfo fi;
86 if (!makeFileList(szDirName, &fi, bDirOnly)) return false;
87
88 return m_writer.writeFileListData((unsigned char)flags, &fi);
89}
90
91bool
92SFileTransfer::processFileDownloadRequest()
93{
94 char szName[FT_FILENAME_SIZE] = {0};
95 unsigned int nameSize = FT_FILENAME_SIZE;
96 unsigned int position = 0;
97
98 if (!m_reader.readFileDownloadRqst(&nameSize, szName, &position)) return false;
99
100 if (!convertPathFromNet(szName)) return false;
101
102 if (m_bDownloadStarted) {
103 char reason[] = "The download is already started";
104 m_writer.writeFileLastRqstFailed(msgTypeFileDownloadRequest, strlen(reason), reason);
105 return false;
106 }
107
108 if (!m_fileReader.create(szName)) return false;
109
110 m_bDownloadStarted = true;
111
112 sendFileDownloadPortion();
113
114 return true;
115}
116
117bool
118SFileTransfer::sendFileDownloadPortion()
119{
120 char buffer[FT_MAX_SENDING_SIZE];
121 unsigned int bytesRead = 0;
122
123 if (m_fileReader.read((void *)buffer, FT_MAX_SENDING_SIZE, &bytesRead)) {
124 if (bytesRead == 0) {
125 m_writer.writeFileDownloadData(m_fileReader.getTime());
126 m_fileReader.close();
127 m_bDownloadStarted = false;
128 return true;
129 } else {
130 m_writer.writeFileDownloadData(bytesRead, buffer);
131 return initDownloadCallback();
132 }
133 } else {
134 char reason[] = "Error while reading from file";
135 m_writer.writeFileDownloadFailed(strlen(reason), reason);
136 m_fileReader.close();
137 m_bDownloadStarted = false;
138 return true;
139 }
140}
141
142bool
143SFileTransfer::processFileUploadRequest()
144{
145 char szName[FT_FILENAME_SIZE] = {0};
146 unsigned int nameSize = FT_FILENAME_SIZE;
147 unsigned int position = 0;
148
149 if (!m_reader.readFileUploadRqst(&nameSize, szName, &position)) return false;
150
151 if (!convertPathFromNet(szName)) return false;
152
153 if (m_bUploadStarted) {
154 char reason[] = "The upload is already started";
155 m_writer.writeFileLastRqstFailed(msgTypeFileUploadRequest, strlen(reason), reason);
156 return false;
157 }
158
159 if (!m_fileWriter.create(szName)) {
160 char reason[] = "Can't create local file";
161 m_writer.writeFileLastRqstFailed(msgTypeFileUploadRequest, strlen(reason), reason);
162 return true;
163 }
164
165 m_bUploadStarted = true;
166
167 return true;
168}
169
170bool
171SFileTransfer::processFileUploadData()
172{
173 unsigned int dataSize = 0;
174 unsigned int modTime = 0;
175
176 void *pUploadData = m_reader.readFileUploadData(&dataSize, &modTime);
177
178 if (!m_bUploadStarted) {
179 char reason[] = "Upload is impossible";
180 m_writer.writeFileUploadCancel(strlen(reason), reason);
181 } else {
182 if (pUploadData == NULL) {
183 if (modTime == 0) {
184 char reason[] = "Upload failed";
185 m_writer.writeFileUploadCancel(strlen(reason), reason);
186 } else {
187 m_fileWriter.setTime(modTime);
188 }
189 m_fileWriter.close();
190 m_bUploadStarted = false;
191 } else {
192 unsigned int dataWritten = 0;
193 m_fileWriter.write(pUploadData, dataSize, &dataWritten);
194 if (dataWritten != dataSize) {
195 char reason[] = "Upload failed";
196 m_writer.writeFileUploadCancel(strlen(reason), reason);
197 m_fileWriter.close();
198 m_bUploadStarted = false;
199 }
200 }
201 }
Constantin Kaplinskyade6bde2006-05-19 10:58:37 +0000202 // FIXME: For the next line, gcc says:
203 // warning: deleting `void *' is undefined
204 // Perhaps it should not be `void *' at all.
Constantin Kaplinsky4a1f6952006-05-19 10:09:44 +0000205 delete [] pUploadData;
206 return true;
207}
208
209bool
210SFileTransfer::processFileDownloadCancel()
211{
212 char szReason[FT_FILENAME_SIZE] = {0};
213 unsigned int reasonSize = FT_FILENAME_SIZE;
214
215 if (!m_reader.readFileDownloadCancel(&reasonSize, szReason)) return false;
216
217 m_fileReader.close();
218 m_bDownloadStarted = false;
219 return true;
220}
221
222bool
223SFileTransfer::processFileUploadFailed()
224{
225 char szReason[FT_FILENAME_SIZE] = {0};
226 unsigned int reasonSize = FT_FILENAME_SIZE;
227
228 if (!m_reader.readFileUploadFailed(&reasonSize, szReason)) return false;
229
230 deleteIt(m_fileWriter.getFilename());
231 m_fileWriter.close();
232 m_bUploadStarted = false;
233 return true;
234}
235
236bool
237SFileTransfer::processFileCreateDirRequest()
238{
239 char szName[FT_FILENAME_SIZE] = {0};
240 unsigned int nameSize = FT_FILENAME_SIZE;
241
242 if (!m_reader.readFileCreateDirRqst(&nameSize, szName)) return false;
243
244 if (!convertPathFromNet(szName)) return false;
245
246 return createDir(szName);
247}
248
249bool
250SFileTransfer::processFileDirSizeRequest()
251{
252 char szName[FT_FILENAME_SIZE] = {0};
253 unsigned int nameSize = FT_FILENAME_SIZE;
254
255 if (!m_reader.readFileDirSizeRqst(&nameSize, szName)) return false;
256
257 if (!convertPathFromNet(szName)) return false;
258
259 unsigned short highSize16 = 0;
260 unsigned int lowSize32 = 0;
261
262 if (!getDirSize(szName, &highSize16, &lowSize32)) return false;
263
264 return m_writer.writeFileDirSizeData(lowSize32, highSize16);
265}
266
267bool
268SFileTransfer::processFileRenameRequest()
269{
270 char szOldName[FT_FILENAME_SIZE] = {0};
271 char szNewName[FT_FILENAME_SIZE] = {0};
272
273 unsigned int oldNameSize = FT_FILENAME_SIZE;
274 unsigned int newNameSize = FT_FILENAME_SIZE;
275
276 if (!m_reader.readFileRenameRqst(&oldNameSize, &newNameSize, szOldName, szNewName)) return false;
277
278 if ((!convertPathFromNet(szOldName)) || (!convertPathFromNet(szNewName))) return false;
279
280 return renameIt(szOldName, szNewName);
281}
282
283bool
284SFileTransfer::processFileDeleteRequest()
285{
286 char szName[FT_FILENAME_SIZE] = {0};
287 unsigned int nameSize = FT_FILENAME_SIZE;
288
289 if (!m_reader.readFileDeleteRqst(&nameSize, szName)) return false;
290
291 if (!convertPathFromNet(szName)) return false;
292
293 return deleteIt(szName);
294}
295
296bool
297SFileTransfer::convertPathFromNet(char *pszPath)
298{
299 return true;
300}
301
302bool
303SFileTransfer::makeFileList(char *pszPath, FileInfo *pFI, bool bDirOnly)
304{
305 return false;
306}
307
308bool
309SFileTransfer::deleteIt(char *pszPath)
310{
311 return false;
312}
313
314bool
315SFileTransfer::renameIt(char *pszOldPath, char *pszNewPath)
316{
317 return false;
318}
319
320bool
321SFileTransfer::createDir(char *pszPath)
322{
323 return false;
324}
325
326bool
327SFileTransfer::getDirSize(char *pszName, unsigned short *pHighSize16,
328 unsigned int *pLowSize32)
329{
330 return false;
331}
332
333bool
334SFileTransfer::initDownloadCallback()
335{
336 return false;
337}