blob: 9168806e5f6b2dafaf6d4ab7d23aa19ea0a4e1e3 [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{
33 FILEINFO *pF = (FILEINFO *) F;
34 FILEINFO *pS = (FILEINFO *) S;
35 if (pF->info.flags == pS->info.flags) {
Constantin Kaplinsky1b33a632005-10-18 11:34:15 +000036 return strcasecmp(pF->name, pS->name);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000037 } else {
38 if (pF->info.flags == FT_ATTR_FOLDER) return -1;
39 if (pS->info.flags == FT_ATTR_FOLDER)
40 return 1;
41 else
Constantin Kaplinsky1b33a632005-10-18 11:34:15 +000042 return strcasecmp(pF->name, pS->name);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000043 }
44 return 0;
45}
46
47FileInfo::FileInfo()
48{
49 m_numEntries = 0;
50 m_pEntries = NULL;
51}
52
53FileInfo::~FileInfo()
54{
55 free();
56}
57
58void
59FileInfo::add(FileInfo *pFI)
60{
61 m_numEntries = pFI->getNumEntries();
62 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
63 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
64
65 m_pEntries = pTemporary;
66 pTemporary = NULL;
67}
68
69void
70FileInfo::add(FILEINFO *pFIStruct)
71{
72 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
73}
74
75void
76FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
77{
78 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
79 if (m_numEntries != 0)
80 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
81
82 strcpy(pTemporary[m_numEntries].name, pName);
83
84 pTemporary[m_numEntries].info.size = size;
85 pTemporary[m_numEntries].info.data = data;
86 pTemporary[m_numEntries].info.flags = flags;
87
88 if (m_pEntries != NULL) {
89 delete [] m_pEntries;
90 m_pEntries = NULL;
91 }
92
93 m_pEntries = pTemporary;
94 pTemporary = NULL;
95 m_numEntries++;
96}
97
98
99char *
100FileInfo::getNameAt(unsigned int number)
101{
102 if ((number >= 0) && (number < m_numEntries)) {
103 return m_pEntries[number].name;
104 }
105 return NULL;
106}
107
108bool
109FileInfo::setNameAt(unsigned int number, char *pName)
110{
111 if ((number >= 0) && (number < m_numEntries)) {
112 strcpy(m_pEntries[number].name, pName);
113 return true;
114 }
115 return false;
116}
117
118unsigned int
119FileInfo::getSizeAt(unsigned int number)
120{
121 if ((number >= 0) && (number < m_numEntries)) {
122 return m_pEntries[number].info.size;
123 }
124 return 0;
125}
126
127unsigned int
128FileInfo::getDataAt(unsigned int number)
129{
130 if ((number >= 0) && (number < m_numEntries)) {
131 return m_pEntries[number].info.data;
132 }
133 return 0;
134}
135
136unsigned int
137FileInfo::getFlagsAt(unsigned int number)
138{
139 if ((number >= 0) && (number < m_numEntries)) {
140 return m_pEntries[number].info.flags;
141 }
142 return 0;
143}
144
145FILEINFO *
146FileInfo::getFullDataAt(unsigned int number)
147{
148 if ((number >= 0) && (number < m_numEntries)) {
149 return &m_pEntries[number];
150 }
151 return NULL;
152}
153
154bool
155FileInfo::setSizeAt(unsigned int number, unsigned int value)
156{
157 if ((number >= 0) && (number < m_numEntries)) {
158 m_pEntries[number].info.size = value;
159 return true;
160 }
161 return false;
162}
163
164bool
165FileInfo::setDataAt(unsigned int number, unsigned int value)
166{
167 if ((number >= 0) && (number < m_numEntries)) {
168 m_pEntries[number].info.data = value;
169 return true;
170 }
171 return false;
172}
173
174bool
175FileInfo::setFlagsAt(unsigned int number, unsigned int value)
176{
177 if ((number >= 0) && (number < m_numEntries)) {
178 m_pEntries[number].info.flags = value;
179 return true;
180 }
181 return false;
182}
183
184bool
185FileInfo::deleteAt(unsigned int number)
186{
187 if ((number >= m_numEntries) || (number < 0)) return false;
188
189 FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
190
191 if (number == 0) {
192 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
193 } else {
194 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
195 if (number != (m_numEntries - 1))
196 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
197 }
198
199 if (m_pEntries != NULL) {
200 delete [] m_pEntries;
201 m_pEntries = NULL;
202 }
203 m_pEntries = pTemporary;
204 pTemporary = NULL;
205 m_numEntries--;
206 return true;
207}
208
209unsigned int
210FileInfo::getNumEntries()
211{
212 return m_numEntries;
213}
214
215void
216FileInfo::sort()
217{
218 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
219}
220
221void
222FileInfo::free()
223{
224 if (m_pEntries != NULL) {
225 delete [] m_pEntries;
226 m_pEntries = NULL;
227 }
228 m_numEntries = 0;
229}