blob: 356bead4a0f21cc2642875c49a2999f8600e11af [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
24using namespace rfb;
25
26int
27CompareFileInfo(const void *F, const void *S)
28{
29 FILEINFO *pF = (FILEINFO *) F;
30 FILEINFO *pS = (FILEINFO *) S;
31 if (pF->info.flags == pS->info.flags) {
32 return stricmp(pF->name, pS->name);
33 } else {
34 if (pF->info.flags == FT_ATTR_FOLDER) return -1;
35 if (pS->info.flags == FT_ATTR_FOLDER)
36 return 1;
37 else
38 return stricmp(pF->name, pS->name);
39 }
40 return 0;
41}
42
43FileInfo::FileInfo()
44{
45 m_numEntries = 0;
46 m_pEntries = NULL;
47}
48
49FileInfo::~FileInfo()
50{
51 free();
52}
53
54void
55FileInfo::add(FileInfo *pFI)
56{
57 m_numEntries = pFI->getNumEntries();
58 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
59 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
60
61 m_pEntries = pTemporary;
62 pTemporary = NULL;
63}
64
65void
66FileInfo::add(FILEINFO *pFIStruct)
67{
68 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
69}
70
71void
72FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
73{
74 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
75 if (m_numEntries != 0)
76 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
77
78 strcpy(pTemporary[m_numEntries].name, pName);
79
80 pTemporary[m_numEntries].info.size = size;
81 pTemporary[m_numEntries].info.data = data;
82 pTemporary[m_numEntries].info.flags = flags;
83
84 if (m_pEntries != NULL) {
85 delete [] m_pEntries;
86 m_pEntries = NULL;
87 }
88
89 m_pEntries = pTemporary;
90 pTemporary = NULL;
91 m_numEntries++;
92}
93
94
95char *
96FileInfo::getNameAt(unsigned int number)
97{
98 if ((number >= 0) && (number < m_numEntries)) {
99 return m_pEntries[number].name;
100 }
101 return NULL;
102}
103
104bool
105FileInfo::setNameAt(unsigned int number, char *pName)
106{
107 if ((number >= 0) && (number < m_numEntries)) {
108 strcpy(m_pEntries[number].name, pName);
109 return true;
110 }
111 return false;
112}
113
114unsigned int
115FileInfo::getSizeAt(unsigned int number)
116{
117 if ((number >= 0) && (number < m_numEntries)) {
118 return m_pEntries[number].info.size;
119 }
120 return 0;
121}
122
123unsigned int
124FileInfo::getDataAt(unsigned int number)
125{
126 if ((number >= 0) && (number < m_numEntries)) {
127 return m_pEntries[number].info.data;
128 }
129 return 0;
130}
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{
144 if ((number >= 0) && (number < m_numEntries)) {
145 return &m_pEntries[number];
146 }
147 return NULL;
148}
149
150bool
151FileInfo::setSizeAt(unsigned int number, unsigned int value)
152{
153 if ((number >= 0) && (number < m_numEntries)) {
154 m_pEntries[number].info.size = value;
155 return true;
156 }
157 return false;
158}
159
160bool
161FileInfo::setDataAt(unsigned int number, unsigned int value)
162{
163 if ((number >= 0) && (number < m_numEntries)) {
164 m_pEntries[number].info.data = value;
165 return true;
166 }
167 return false;
168}
169
170bool
171FileInfo::setFlagsAt(unsigned int number, unsigned int value)
172{
173 if ((number >= 0) && (number < m_numEntries)) {
174 m_pEntries[number].info.flags = value;
175 return true;
176 }
177 return false;
178}
179
180bool
181FileInfo::deleteAt(unsigned int number)
182{
183 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;
203}
204
205unsigned int
206FileInfo::getNumEntries()
207{
208 return m_numEntries;
209}
210
211void
212FileInfo::sort()
213{
214 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
215}
216
217void
218FileInfo::free()
219{
220 if (m_pEntries != NULL) {
221 delete [] m_pEntries;
222 m_pEntries = NULL;
223 }
224 m_numEntries = 0;
225}