blob: f2e0291f768b810315bec02df45c4f25ad883d54 [file] [log] [blame]
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +00001/* Copyright (C) 2005 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 *
Peter Åstrand7877cd62009-02-25 16:15:48 +000020 *
Constantin Kaplinskya2adc8d2006-05-25 05:01:55 +000021 *
22 */
23
24#include <rfb/FileInfo.h>
25#include <rfb/util.h>
26
27#ifdef _WIN32
28#define strcasecmp _stricmp
29#endif
30
31using namespace rfb;
32
33// FIXME: Under Unix, file names are case-sensitive.
34
35int
36CompareFileInfo(const void *F, const void *S)
37{
38 FILEINFO *pF = (FILEINFO *) F;
39 FILEINFO *pS = (FILEINFO *) S;
40 if (pF->info.flags == pS->info.flags) {
41 return strcasecmp(pF->name, pS->name);
42 } else {
43 if (pF->info.flags == FT_ATTR_DIR) return -1;
44 if (pS->info.flags == FT_ATTR_DIR)
45 return 1;
46 else
47 return strcasecmp(pF->name, pS->name);
48 }
49
50 return 0;
51}
52
53FileInfo::FileInfo()
54{
55 m_numEntries = 0;
56 m_pEntries = NULL;
57}
58
59FileInfo::~FileInfo()
60{
61 free();
62}
63
64void
65FileInfo::add(FileInfo *pFI)
66{
67 m_numEntries = pFI->getNumEntries();
68 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
69 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
70
71 m_pEntries = pTemporary;
72 pTemporary = NULL;
73}
74
75void
76FileInfo::add(FILEINFO *pFIStruct)
77{
78 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
79}
80
81void
82FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
83{
84 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
85 if (m_numEntries != 0)
86 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
87 strcpy(pTemporary[m_numEntries].name, pName);
88 pTemporary[m_numEntries].info.size = size;
89 pTemporary[m_numEntries].info.data = data;
90 pTemporary[m_numEntries].info.flags = flags;
91 if (m_pEntries != NULL) {
92 delete [] m_pEntries;
93 m_pEntries = NULL;
94 }
95 m_pEntries = pTemporary;
96 pTemporary = NULL;
97 m_numEntries++;
98}
99
100char *
101FileInfo::getNameAt(unsigned int number)
102{
103 if ((number >= 0) && (number < m_numEntries)) {
104 return m_pEntries[number].name;
105 }
106 return NULL;
107}
108
109bool
110FileInfo::setNameAt(unsigned int number, char *pName)
111{
112 if ((number >= 0) && (number < m_numEntries)) {
113 strcpy(m_pEntries[number].name, pName);
114 return true;
115 }
116 return false;
117}
118
119unsigned int
120FileInfo::getSizeAt(unsigned int number)
121{
122 if ((number >= 0) && (number < m_numEntries)) {
123 return m_pEntries[number].info.size;
124 }
125 return 0;
126}
127
128unsigned int
129FileInfo::getDataAt(unsigned int number)
130{
131 if ((number >= 0) && (number < m_numEntries)) {
132 return m_pEntries[number].info.data;
133 }
134 return 0;
135}
136
137unsigned int
138FileInfo::getFlagsAt(unsigned int number)
139{
140 if ((number >= 0) && (number < m_numEntries)) {
141 return m_pEntries[number].info.flags;
142 }
143 return 0;
144}
145
146FILEINFO *
147FileInfo::getFullDataAt(unsigned int number)
148{
149 if ((number >= 0) && (number < m_numEntries)) {
150 return &m_pEntries[number];
151 }
152 return NULL;
153}
154
155bool
156FileInfo::setSizeAt(unsigned int number, unsigned int value)
157{
158 if ((number >= 0) && (number < m_numEntries)) {
159 m_pEntries[number].info.size = value;
160 return true;
161 }
162 return false;
163}
164
165bool
166FileInfo::setDataAt(unsigned int number, unsigned int value)
167{
168 if ((number >= 0) && (number < m_numEntries)) {
169 m_pEntries[number].info.data = value;
170 return true;
171 }
172 return false;
173}
174
175bool
176FileInfo::setFlagsAt(unsigned int number, unsigned int value)
177{
178 if ((number >= 0) && (number < m_numEntries)) {
179 m_pEntries[number].info.flags = value;
180 return true;
181 }
182 return false;
183}
184
185bool
186FileInfo::deleteAt(unsigned int number)
187{
188 if ((number >= m_numEntries) || (number < 0)) return false;
189
190 FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
191
192 if (number == 0) {
193 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
194 } else {
195 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
196 if (number != (m_numEntries - 1))
197 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
198 }
199
200 if (m_pEntries != NULL) {
201 delete [] m_pEntries;
202 m_pEntries = NULL;
203 }
204 m_pEntries = pTemporary;
205 pTemporary = NULL;
206 m_numEntries--;
207 return true;
208}
209
210unsigned int
211FileInfo::getNumEntries()
212{
213 return m_numEntries;
214}
215
216void
217FileInfo::sort()
218{
219 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
220}
221
222void
223FileInfo::free()
224{
225 if (m_pEntries != NULL) {
226 delete [] m_pEntries;
227 m_pEntries = NULL;
228 }
229 m_numEntries = 0;
230}
231
232unsigned int
233FileInfo::getFilenamesSize()
234{
235 if (getNumEntries() == 0) return 0;
236
237 unsigned int filenamesSize = 0;
238
239 for (unsigned int i = 0; i < getNumEntries(); i++) {
240 filenamesSize += strlen(getNameAt(i));
241 }
242
243 return filenamesSize;
244}