blob: 34074f7dac0c31d44ee183fdc3c4f1e76a8d0a22 [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>
Constantin Kaplinskya6866902006-03-02 12:03:30 +000023#include <rfb/util.h>
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000024
Constantin Kaplinsky1b33a632005-10-18 11:34:15 +000025#ifdef _WIN32
26#define strcasecmp _stricmp
27#endif
28
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000029using namespace rfb;
30
Constantin Kaplinsky6e01f372006-03-02 12:07:12 +000031// FIXME: Under Unix, file names are case-sensitive.
32
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000033int
34CompareFileInfo(const void *F, const void *S)
35{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000036 FILEINFO *pF = (FILEINFO *) F;
37 FILEINFO *pS = (FILEINFO *) S;
38 if (pF->info.flags == pS->info.flags) {
39 return strcasecmp(pF->name, pS->name);
40 } else {
41 if (pF->info.flags == FT_ATTR_DIR) return -1;
42 if (pS->info.flags == FT_ATTR_DIR)
43 return 1;
44 else
45 return strcasecmp(pF->name, pS->name);
46 }
47
48 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000049}
50
51FileInfo::FileInfo()
52{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000053 m_numEntries = 0;
54 m_pEntries = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000055}
56
57FileInfo::~FileInfo()
58{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000059 free();
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000060}
61
62void
63FileInfo::add(FileInfo *pFI)
64{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000065 m_numEntries = pFI->getNumEntries();
66 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
67 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
68
69 m_pEntries = pTemporary;
70 pTemporary = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000071}
72
73void
74FileInfo::add(FILEINFO *pFIStruct)
75{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000076 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000077}
78
79void
80FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
81{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000082 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
83 if (m_numEntries != 0)
84 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
85 strcpy(pTemporary[m_numEntries].name, pName);
86 pTemporary[m_numEntries].info.size = size;
87 pTemporary[m_numEntries].info.data = data;
88 pTemporary[m_numEntries].info.flags = flags;
89 if (m_pEntries != NULL) {
90 delete [] m_pEntries;
91 m_pEntries = NULL;
92 }
93 m_pEntries = pTemporary;
94 pTemporary = NULL;
95 m_numEntries++;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000096}
97
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000098char *
99FileInfo::getNameAt(unsigned int number)
100{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000101 if ((number >= 0) && (number < m_numEntries)) {
102 return m_pEntries[number].name;
103 }
104 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000105}
106
107bool
108FileInfo::setNameAt(unsigned int number, char *pName)
109{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000110 if ((number >= 0) && (number < m_numEntries)) {
111 strcpy(m_pEntries[number].name, pName);
112 return true;
113 }
114 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000115}
116
117unsigned int
118FileInfo::getSizeAt(unsigned int number)
119{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000120 if ((number >= 0) && (number < m_numEntries)) {
121 return m_pEntries[number].info.size;
122 }
123 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000124}
125
126unsigned int
127FileInfo::getDataAt(unsigned int number)
128{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000129 if ((number >= 0) && (number < m_numEntries)) {
130 return m_pEntries[number].info.data;
131 }
132 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000133}
134
135unsigned int
136FileInfo::getFlagsAt(unsigned int number)
137{
138 if ((number >= 0) && (number < m_numEntries)) {
139 return m_pEntries[number].info.flags;
140 }
141 return 0;
142}
143
144FILEINFO *
145FileInfo::getFullDataAt(unsigned int number)
146{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000147 if ((number >= 0) && (number < m_numEntries)) {
148 return &m_pEntries[number];
149 }
150 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000151}
152
153bool
154FileInfo::setSizeAt(unsigned int number, unsigned int value)
155{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000156 if ((number >= 0) && (number < m_numEntries)) {
157 m_pEntries[number].info.size = value;
158 return true;
159 }
160 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000161}
162
163bool
164FileInfo::setDataAt(unsigned int number, unsigned int value)
165{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000166 if ((number >= 0) && (number < m_numEntries)) {
167 m_pEntries[number].info.data = value;
168 return true;
169 }
170 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000171}
172
173bool
174FileInfo::setFlagsAt(unsigned int number, unsigned int value)
175{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000176 if ((number >= 0) && (number < m_numEntries)) {
177 m_pEntries[number].info.flags = value;
178 return true;
179 }
180 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000181}
182
183bool
184FileInfo::deleteAt(unsigned int number)
185{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000186 if ((number >= m_numEntries) || (number < 0)) return false;
187
188 FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
189
190 if (number == 0) {
191 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
192 } else {
193 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
194 if (number != (m_numEntries - 1))
195 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
196 }
197
198 if (m_pEntries != NULL) {
199 delete [] m_pEntries;
200 m_pEntries = NULL;
201 }
202 m_pEntries = pTemporary;
203 pTemporary = NULL;
204 m_numEntries--;
205 return true;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000206}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000207
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000208unsigned int
209FileInfo::getNumEntries()
210{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000211 return m_numEntries;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000212}
213
214void
215FileInfo::sort()
216{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000217 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000218}
219
220void
221FileInfo::free()
222{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000223 if (m_pEntries != NULL) {
224 delete [] m_pEntries;
225 m_pEntries = NULL;
226 }
227 m_numEntries = 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000228}
Dennis Syrovatskyd5a05532005-12-18 15:08:34 +0000229
230unsigned int
231FileInfo::getFilenamesSize()
232{
233 if (getNumEntries() == 0) return 0;
234
235 unsigned int filenamesSize = 0;
236
237 for (unsigned int i = 0; i < getNumEntries(); i++) {
238 filenamesSize += strlen(getNameAt(i));
239 }
240
241 return filenamesSize;
242}