blob: a8fd6e1357c40c36215cc95c7a86f274bb4d9298 [file] [log] [blame]
Dennis Syrovatsky3955d752005-11-10 05:40:07 +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// -=- FTMsgWriter.cxx
23
24#include <vncviewer/FTMsgWriter.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
29FTMsgWriter::FTMsgWriter(rdr::OutStream *pOS)
30{
31 m_pOutStream = pOS;
32}
33
34FTMsgWriter::~FTMsgWriter()
35{
36}
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +000037
38bool
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000039FTMsgWriter::writeFileListRqst(unsigned short dirnameLen, char *pDirName,
40 bool bDirOnly)
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +000041{
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000042 if (dirnameLen >= FT_FILENAME_SIZE) return false;
43
Dennis Syrovatsky10f47562005-11-10 08:10:12 +000044 char dirName[FT_FILENAME_SIZE];
45 strcpy(dirName, pDirName);
46 int len = convertToUnixPath(dirName);
47 if (len <= 0) return false;
48
49 unsigned char flags = 0;
50 if (bDirOnly) flags = 0x10;
51
52 m_pOutStream->writeU8(msgTypeFileListRequest);
53 m_pOutStream->writeU8(flags);
54 m_pOutStream->writeU16(len);
55 m_pOutStream->writeBytes((void *)dirName, len);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +000056 m_pOutStream->flush();
Dennis Syrovatsky10f47562005-11-10 08:10:12 +000057
58 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +000059}
60
61
62bool
63FTMsgWriter::writeFileDownloadCancel(unsigned short reasonLen, char *pReason)
64{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +000065 m_pOutStream->writeU8(msgTypeFileDownloadCancel);
66 return writeU8U16StringMsg(reasonLen, pReason);
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +000067}
68
69bool
70FTMsgWriter::writeFileDownloadRqst(unsigned short filenameLen, char *pFilename,
71 unsigned int position)
72{
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000073 if (filenameLen >= FT_FILENAME_SIZE) return false;
Dennis Syrovatsky263e8252005-11-23 02:58:50 +000074
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000075 char filename[FT_FILENAME_SIZE];
76 strcpy(filename, pFilename);
77 unsigned short len = (unsigned short) convertToUnixPath(filename);
78 if (len <= 0) return false;
79
80 m_pOutStream->writeU8(msgTypeFileDownloadRequest);
81 m_pOutStream->writeU8(0);
82 m_pOutStream->writeU16(len);
83 m_pOutStream->writeU32(position);
84 m_pOutStream->writeBytes(filename, len);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +000085 m_pOutStream->flush();
86
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000087 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +000088}
89
90bool
91FTMsgWriter::writeFileUploadData(unsigned short dataSize, char *pData)
92{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +000093 m_pOutStream->writeU8(msgTypeFileUploadData);
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +000094 m_pOutStream->writeU8(0);
95 m_pOutStream->writeU16(dataSize);
96 m_pOutStream->writeU16(dataSize);
97 m_pOutStream->writeBytes(pData, dataSize);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +000098 m_pOutStream->flush();
99
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000100 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000101}
102
103bool
104FTMsgWriter::writeFileUploadData(unsigned int modTime)
105{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000106 m_pOutStream->writeU8(msgTypeFileUploadData);
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000107 m_pOutStream->writeU8(0);
108 m_pOutStream->writeU16(0);
109 m_pOutStream->writeU16(0);
110 m_pOutStream->writeU32(modTime);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +0000111 m_pOutStream->flush();
112
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000113 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000114}
115
116bool
117FTMsgWriter::writeFileUploadFailed(unsigned short reasonLen, char *pReason)
118{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000119 m_pOutStream->writeU8(msgTypeFileUploadFailed);
120 return writeU8U16StringMsg(reasonLen, pReason);
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000121}
122
123bool
124FTMsgWriter::writeFileUploadRqst(unsigned short filenameLen, char *pFilename,
125 unsigned int position)
126{
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000127 if (filenameLen >= FT_FILENAME_SIZE) return false;
Dennis Syrovatsky263e8252005-11-23 02:58:50 +0000128
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000129 char filename[FT_FILENAME_SIZE];
130 strcpy(filename, pFilename);
131 unsigned short len = (unsigned short) convertToUnixPath(filename);
132 if (len <= 0) return false;
133
134 m_pOutStream->writeU8(msgTypeFileUploadRequest);
135 m_pOutStream->writeU8(0);
136 m_pOutStream->writeU16(len);
137 m_pOutStream->writeU32(position);
138 m_pOutStream->writeBytes(filename, len);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +0000139 m_pOutStream->flush();
140
Dennis Syrovatskyf7b24492005-11-23 04:14:10 +0000141 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000142}
143
144bool
145FTMsgWriter::writeFileCreateDirRqst(unsigned short dirNameLen, char *pDirName)
146{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000147 if (dirNameLen >= FT_FILENAME_SIZE) return false;
148
149 char path[FT_FILENAME_SIZE];
150 strcpy(path, pDirName);
151 int nameLen = convertToUnixPath(path);
152
153 m_pOutStream->writeU8(msgTypeFileCreateDirRequest);
154 return writeU8U16StringMsg(nameLen, path);
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000155}
156
157bool
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000158FTMsgWriter::writeFileDirSizeRqst(unsigned short dirNameLen, char *pDirName)
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000159{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000160 if (dirNameLen >= FT_FILENAME_SIZE) return false;
161
162 char path[FT_FILENAME_SIZE];
163 strcpy(path, pDirName);
164 int nameLen = convertToUnixPath(path);
165
166 m_pOutStream->writeU8(msgTypeFileDirSizeRequest);
167 return writeU8U16StringMsg(nameLen, path);
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000168}
169
170bool
171FTMsgWriter::writeFileRenameRqst(unsigned short oldNameLen, unsigned short newNameLen,
172 char *pOldName, char *pNewName)
173{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000174 if ((oldNameLen >= FT_FILENAME_SIZE) || (newNameLen >= FT_FILENAME_SIZE)) return false;
175
176 char oldName[FT_FILENAME_SIZE];
177 char newName[FT_FILENAME_SIZE];
178
179 strcpy(oldName, pOldName);
180 strcpy(newName, pNewName);
181
182 int _oldNameLen = convertToUnixPath(oldName);
183 int _newNameLen = convertToUnixPath(newName);
184
185 m_pOutStream->writeU8(msgTypeFileRenameRequest);
186 m_pOutStream->writeU8(0);
187 m_pOutStream->writeU16(_oldNameLen);
188 m_pOutStream->writeU16(_newNameLen);
189 m_pOutStream->writeBytes(oldName, _oldNameLen);
190 m_pOutStream->writeBytes(newName, _newNameLen);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +0000191 m_pOutStream->flush();
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000192
193 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000194}
195
196bool
197FTMsgWriter::writeFileDeleteRqst(unsigned short nameLen, char *pName)
198{
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000199 if (nameLen >= FT_FILENAME_SIZE) return false;
200
201 char path[FT_FILENAME_SIZE];
202 strcpy(path, pName);
203 int _nameLen = convertToUnixPath(path);
204
205 m_pOutStream->writeU8(msgTypeFileDeleteRequest);
206 return writeU8U16StringMsg(_nameLen, path);
207}
208
209bool
210FTMsgWriter::writeU8U16StringMsg(unsigned short strLength, char *pString)
211{
212 m_pOutStream->writeU8(0);
213 m_pOutStream->writeU16(strLength);
214 m_pOutStream->writeBytes(pString, strLength);
Dennis Syrovatsky263e8252005-11-23 02:58:50 +0000215 m_pOutStream->flush();
Dennis Syrovatsky560600e2005-11-12 07:43:10 +0000216 return true;
Dennis Syrovatsky4558aa82005-11-10 05:54:35 +0000217}
Dennis Syrovatsky10f47562005-11-10 08:10:12 +0000218
219int
220FTMsgWriter::convertToUnixPath(char *path)
221{
222 int len = strlen(path);
223 if (len >= FT_FILENAME_SIZE) return -1;
224 if (len == 0) {strcpy(path, "/"); return 1;}
225 for (int i = (len - 1); i >= 0; i--) {
226 if (path[i] == '\\') path[i] = '/';
227 path[i+1] = path[i];
228 }
229 path[len + 1] = '\0';
230 path[0] = '/';
231 return strlen(path);
232}