blob: 0d770f3984cea28782b9d20a90840887800849d5 [file] [log] [blame]
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +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#include <rfb/FileInfo.h>
23
Constantin Kaplinsky1b33a632005-10-18 11:34:15 +000024#ifdef _WIN32
25#define strcasecmp _stricmp
26#endif
27
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000028using namespace rfb;
29
30int
31CompareFileInfo(const void *F, const void *S)
32{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000033 FILEINFO *pF = (FILEINFO *) F;
34 FILEINFO *pS = (FILEINFO *) S;
35 if (pF->info.flags == pS->info.flags) {
36 return strcasecmp(pF->name, pS->name);
37 } else {
38 if (pF->info.flags == FT_ATTR_DIR) return -1;
39 if (pS->info.flags == FT_ATTR_DIR)
40 return 1;
41 else
42 return strcasecmp(pF->name, pS->name);
43 }
44
45 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000046}
47
48FileInfo::FileInfo()
49{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000050 m_numEntries = 0;
51 m_pEntries = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000052}
53
54FileInfo::~FileInfo()
55{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000056 free();
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000057}
58
59void
60FileInfo::add(FileInfo *pFI)
61{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000062 m_numEntries = pFI->getNumEntries();
63 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
64 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
65
66 m_pEntries = pTemporary;
67 pTemporary = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000068}
69
70void
71FileInfo::add(FILEINFO *pFIStruct)
72{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000073 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000074}
75
76void
77FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
78{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000079 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
80 if (m_numEntries != 0)
81 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
82 strcpy(pTemporary[m_numEntries].name, pName);
83 pTemporary[m_numEntries].info.size = size;
84 pTemporary[m_numEntries].info.data = data;
85 pTemporary[m_numEntries].info.flags = flags;
86 if (m_pEntries != NULL) {
87 delete [] m_pEntries;
88 m_pEntries = NULL;
89 }
90 m_pEntries = pTemporary;
91 pTemporary = NULL;
92 m_numEntries++;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000093}
94
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000095char *
96FileInfo::getNameAt(unsigned int number)
97{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000098 if ((number >= 0) && (number < m_numEntries)) {
99 return m_pEntries[number].name;
100 }
101 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000102}
103
104bool
105FileInfo::setNameAt(unsigned int number, char *pName)
106{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000107 if ((number >= 0) && (number < m_numEntries)) {
108 strcpy(m_pEntries[number].name, pName);
109 return true;
110 }
111 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000112}
113
114unsigned int
115FileInfo::getSizeAt(unsigned int number)
116{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000117 if ((number >= 0) && (number < m_numEntries)) {
118 return m_pEntries[number].info.size;
119 }
120 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000121}
122
123unsigned int
124FileInfo::getDataAt(unsigned int number)
125{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000126 if ((number >= 0) && (number < m_numEntries)) {
127 return m_pEntries[number].info.data;
128 }
129 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000130}
131
132unsigned int
133FileInfo::getFlagsAt(unsigned int number)
134{
135 if ((number >= 0) && (number < m_numEntries)) {
136 return m_pEntries[number].info.flags;
137 }
138 return 0;
139}
140
141FILEINFO *
142FileInfo::getFullDataAt(unsigned int number)
143{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000144 if ((number >= 0) && (number < m_numEntries)) {
145 return &m_pEntries[number];
146 }
147 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000148}
149
150bool
151FileInfo::setSizeAt(unsigned int number, unsigned int value)
152{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000153 if ((number >= 0) && (number < m_numEntries)) {
154 m_pEntries[number].info.size = value;
155 return true;
156 }
157 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000158}
159
160bool
161FileInfo::setDataAt(unsigned int number, unsigned int value)
162{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000163 if ((number >= 0) && (number < m_numEntries)) {
164 m_pEntries[number].info.data = value;
165 return true;
166 }
167 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000168}
169
170bool
171FileInfo::setFlagsAt(unsigned int number, unsigned int value)
172{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000173 if ((number >= 0) && (number < m_numEntries)) {
174 m_pEntries[number].info.flags = value;
175 return true;
176 }
177 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000178}
179
180bool
181FileInfo::deleteAt(unsigned int number)
182{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000183 if ((number >= m_numEntries) || (number < 0)) return false;
184
185 FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
186
187 if (number == 0) {
188 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
189 } else {
190 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
191 if (number != (m_numEntries - 1))
192 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
193 }
194
195 if (m_pEntries != NULL) {
196 delete [] m_pEntries;
197 m_pEntries = NULL;
198 }
199 m_pEntries = pTemporary;
200 pTemporary = NULL;
201 m_numEntries--;
202 return true;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000203}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000204
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000205unsigned int
206FileInfo::getNumEntries()
207{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000208 return m_numEntries;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000209}
210
211void
212FileInfo::sort()
213{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000214 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000215}
216
217void
218FileInfo::free()
219{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000220 if (m_pEntries != NULL) {
221 delete [] m_pEntries;
222 m_pEntries = NULL;
223 }
224 m_numEntries = 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000225}
Dennis Syrovatskyd5a05532005-12-18 15:08:34 +0000226
227unsigned int
228FileInfo::getFilenamesSize()
229{
230 if (getNumEntries() == 0) return 0;
231
232 unsigned int filenamesSize = 0;
233
234 for (unsigned int i = 0; i < getNumEntries(); i++) {
235 filenamesSize += strlen(getNameAt(i));
236 }
237
238 return filenamesSize;
239}
240
241char *
242FileInfo::getAllFilenames(unsigned int *pFilenameSize)
243{
244 unsigned int filenameSize = getFilenamesSize() + getNumEntries();
245
246 char *pFilenames = new char[filenameSize];
247 unsigned int pos = 0;
248
249 for (unsigned int i = 0; i < getNumEntries(); i++) {
250 char *pName = getNameAt(i);
251 unsigned int len = strlen(pName);
252
253 memcpy((void *)&pFilenames[pos], pName, len + 1);
254 pos += len + 2;
255 }
256
257 *pFilenameSize = filenameSize;
258 return pFilenames;
259}