blob: 21e18f24037e4cf404af2820064f7dc2c0f7912c [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
31int
32CompareFileInfo(const void *F, const void *S)
33{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000034 FILEINFO *pF = (FILEINFO *) F;
35 FILEINFO *pS = (FILEINFO *) S;
36 if (pF->info.flags == pS->info.flags) {
37 return strcasecmp(pF->name, pS->name);
38 } else {
39 if (pF->info.flags == FT_ATTR_DIR) return -1;
40 if (pS->info.flags == FT_ATTR_DIR)
41 return 1;
42 else
43 return strcasecmp(pF->name, pS->name);
44 }
45
46 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000047}
48
49FileInfo::FileInfo()
50{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000051 m_numEntries = 0;
52 m_pEntries = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000053}
54
55FileInfo::~FileInfo()
56{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000057 free();
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000058}
59
60void
61FileInfo::add(FileInfo *pFI)
62{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000063 m_numEntries = pFI->getNumEntries();
64 FILEINFO *pTemporary = new FILEINFO[m_numEntries];
65 memcpy(pTemporary, pFI->getNameAt(0), m_numEntries * sizeof(FILEINFO));
66
67 m_pEntries = pTemporary;
68 pTemporary = NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000069}
70
71void
72FileInfo::add(FILEINFO *pFIStruct)
73{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000074 add(pFIStruct->name, pFIStruct->info.size, pFIStruct->info.data, pFIStruct->info.flags);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000075}
76
77void
78FileInfo::add(char *pName, unsigned int size, unsigned int data, unsigned int flags)
79{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000080 FILEINFO *pTemporary = new FILEINFO[m_numEntries + 1];
81 if (m_numEntries != 0)
82 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFO));
83 strcpy(pTemporary[m_numEntries].name, pName);
84 pTemporary[m_numEntries].info.size = size;
85 pTemporary[m_numEntries].info.data = data;
86 pTemporary[m_numEntries].info.flags = flags;
87 if (m_pEntries != NULL) {
88 delete [] m_pEntries;
89 m_pEntries = NULL;
90 }
91 m_pEntries = pTemporary;
92 pTemporary = NULL;
93 m_numEntries++;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000094}
95
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +000096char *
97FileInfo::getNameAt(unsigned int number)
98{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +000099 if ((number >= 0) && (number < m_numEntries)) {
100 return m_pEntries[number].name;
101 }
102 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000103}
104
105bool
106FileInfo::setNameAt(unsigned int number, char *pName)
107{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000108 if ((number >= 0) && (number < m_numEntries)) {
109 strcpy(m_pEntries[number].name, pName);
110 return true;
111 }
112 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000113}
114
115unsigned int
116FileInfo::getSizeAt(unsigned int number)
117{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000118 if ((number >= 0) && (number < m_numEntries)) {
119 return m_pEntries[number].info.size;
120 }
121 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000122}
123
124unsigned int
125FileInfo::getDataAt(unsigned int number)
126{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000127 if ((number >= 0) && (number < m_numEntries)) {
128 return m_pEntries[number].info.data;
129 }
130 return 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000131}
132
133unsigned int
134FileInfo::getFlagsAt(unsigned int number)
135{
136 if ((number >= 0) && (number < m_numEntries)) {
137 return m_pEntries[number].info.flags;
138 }
139 return 0;
140}
141
142FILEINFO *
143FileInfo::getFullDataAt(unsigned int number)
144{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000145 if ((number >= 0) && (number < m_numEntries)) {
146 return &m_pEntries[number];
147 }
148 return NULL;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000149}
150
151bool
152FileInfo::setSizeAt(unsigned int number, unsigned int value)
153{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000154 if ((number >= 0) && (number < m_numEntries)) {
155 m_pEntries[number].info.size = value;
156 return true;
157 }
158 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000159}
160
161bool
162FileInfo::setDataAt(unsigned int number, unsigned int value)
163{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000164 if ((number >= 0) && (number < m_numEntries)) {
165 m_pEntries[number].info.data = value;
166 return true;
167 }
168 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000169}
170
171bool
172FileInfo::setFlagsAt(unsigned int number, unsigned int value)
173{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000174 if ((number >= 0) && (number < m_numEntries)) {
175 m_pEntries[number].info.flags = value;
176 return true;
177 }
178 return false;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000179}
180
181bool
182FileInfo::deleteAt(unsigned int number)
183{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000184 if ((number >= m_numEntries) || (number < 0)) return false;
185
186 FILEINFO *pTemporary = new FILEINFO[m_numEntries - 1];
187
188 if (number == 0) {
189 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFO));
190 } else {
191 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFO));
192 if (number != (m_numEntries - 1))
193 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFO));
194 }
195
196 if (m_pEntries != NULL) {
197 delete [] m_pEntries;
198 m_pEntries = NULL;
199 }
200 m_pEntries = pTemporary;
201 pTemporary = NULL;
202 m_numEntries--;
203 return true;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000204}
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000205
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000206unsigned int
207FileInfo::getNumEntries()
208{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000209 return m_numEntries;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000210}
211
212void
213FileInfo::sort()
214{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000215 qsort(m_pEntries, m_numEntries, sizeof(FILEINFO), CompareFileInfo);
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000216}
217
218void
219FileInfo::free()
220{
Dennis Syrovatsky13b4d4c2005-11-28 08:14:18 +0000221 if (m_pEntries != NULL) {
222 delete [] m_pEntries;
223 m_pEntries = NULL;
224 }
225 m_numEntries = 0;
Dennis Syrovatsky487a4e92005-10-18 04:44:36 +0000226}
Dennis Syrovatskyd5a05532005-12-18 15:08:34 +0000227
228unsigned int
229FileInfo::getFilenamesSize()
230{
231 if (getNumEntries() == 0) return 0;
232
233 unsigned int filenamesSize = 0;
234
235 for (unsigned int i = 0; i < getNumEntries(); i++) {
236 filenamesSize += strlen(getNameAt(i));
237 }
238
239 return filenamesSize;
240}