blob: 01807524835445f6955e9961a2438555c5ebaf1f [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 *
20 * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
21 *
22 */
23
24// -=- TransferQueue.
25
26#include <rfb/TransferQueue.h>
27
28using namespace rfb;
29
30TransferQueue::TransferQueue()
31{
32 m_numEntries = 0;
33 m_pEntries = NULL;
34}
35
36TransferQueue::~TransferQueue()
37{
38 free();
39}
40
41void
42TransferQueue::add(TransferQueue *pTQ)
43{
44 for (unsigned int i = 0; i < pTQ->getNumEntries(); i++) {
45 add(pTQ->getLocPathAt(i), pTQ->getRemPathAt(i), pTQ->getLocNameAt(i),
46 pTQ->getRemNameAt(i), pTQ->getSizeAt(i), pTQ->getDataAt(i), pTQ->getFlagsAt(i));
47 }
48}
49
50void
51TransferQueue::add(char *pLocPath, char *pRemPath, FileInfo *pFI, unsigned int flags)
52{
53 char locPath[FT_FILENAME_SIZE];
54 char remPath[FT_FILENAME_SIZE];
55 strcpy(locPath, pLocPath);
56 strcpy(remPath, pRemPath);
57
58 for (unsigned int i = 0; i < pFI->getNumEntries(); i++) {
59 add(locPath, remPath, pFI->getNameAt(i), pFI->getNameAt(i),
60 pFI->getSizeAt(i), pFI->getDataAt(i), (pFI->getFlagsAt(i) | flags));
61 }
62}
63
64void
65TransferQueue::add(char *pLocPath, char *pRemPath, char *pLocName, char *pRemName,
66 unsigned int size, unsigned int data, unsigned int flags)
67{
68 FILEINFOEX *pTemporary = new FILEINFOEX[m_numEntries + 1];
69 if (m_numEntries != 0)
70 memcpy(pTemporary, m_pEntries, m_numEntries * sizeof(FILEINFOEX));
71
72 strcpy(pTemporary[m_numEntries].locPath, pLocPath);
73 strcpy(pTemporary[m_numEntries].locName, pLocName);
74 strcpy(pTemporary[m_numEntries].remPath, pRemPath);
75 strcpy(pTemporary[m_numEntries].remName, pRemName);
76
77 pTemporary[m_numEntries].info.size = size;
78 pTemporary[m_numEntries].info.data = data;
79 pTemporary[m_numEntries].info.flags = flags;
80
81 if (m_pEntries != NULL) {
82 delete [] m_pEntries;
83 m_pEntries = NULL;
84 }
85
86 m_pEntries = pTemporary;
87 pTemporary = NULL;
88 m_numEntries++;
89}
90
91char *
92TransferQueue::getLocPathAt(unsigned int number)
93{
94 if ((number >= 0) && (number < m_numEntries)) {
95 return m_pEntries[number].locPath;
96 }
97 return NULL;
98}
99
100char *
101TransferQueue::getLocNameAt(unsigned int number)
102{
103 if ((number >= 0) && (number < m_numEntries)) {
104 return m_pEntries[number].locName;
105 }
106 return NULL;
107}
108
109char *
110TransferQueue::getRemPathAt(unsigned int number)
111{
112 if ((number >= 0) && (number < m_numEntries)) {
113 return m_pEntries[number].remPath;
114 }
115 return NULL;
116}
117
118char *
119TransferQueue::getRemNameAt(unsigned int number)
120{
121 if ((number >= 0) && (number < m_numEntries)) {
122 return m_pEntries[number].remName;
123 }
124 return NULL;
125}
126
127char *
128TransferQueue::getFullLocPathAt(unsigned int number)
129{
130 if ((number >= 0) && (number < m_numEntries)) {
131 sprintf(m_szFullLocPath, "%s\\%s", getLocPathAt(number), getLocNameAt(number));
132 return m_szFullLocPath;
133 }
134 return NULL;
135}
136
137char *
138TransferQueue::getFullRemPathAt(unsigned int number)
139{
140 if ((number >= 0) && (number < m_numEntries)) {
141 sprintf(m_szFullRemPath, "%s\\%s", getRemPathAt(number), getRemNameAt(number));
142 return m_szFullRemPath;
143 }
144 return NULL;
145}
146
147SIZEDATAFLAGSINFO *
148TransferQueue::getSizeDataFlagsAt(unsigned int number)
149{
150 if ((number >= 0) && (number < m_numEntries)) {
151 return &m_pEntries[number].info;
152 }
153 return NULL;
154}
155
156bool
157TransferQueue::setLocPathAt(unsigned int number, char *pName)
158{
159 if ((number >= 0) && (number < m_numEntries)) {
160 strcpy(m_pEntries[number].locPath, pName);
161 return true;
162 }
163 return false;
164}
165
166bool
167TransferQueue::setLocNameAt(unsigned int number, char *pName)
168{
169 if ((number >= 0) && (number < m_numEntries)) {
170 strcpy(m_pEntries[number].locName, pName);
171 return true;
172 }
173 return false;
174}
175
176bool
177TransferQueue::setRemPathAt(unsigned int number, char *pName)
178{
179 if ((number >= 0) && (number < m_numEntries)) {
180 strcpy(m_pEntries[number].remPath, pName);
181 return true;
182 }
183 return false;
184}
185
186bool
187TransferQueue::setRemNameAt(unsigned int number, char *pName)
188{
189 if ((number >= 0) && (number < m_numEntries)) {
190 strcpy(m_pEntries[number].remName, pName);
191 return true;
192 }
193 return false;
194}
195
196unsigned int
197TransferQueue::getSizeAt(unsigned int number)
198{
199 if ((number >= 0) && (number < m_numEntries)) {
200 return m_pEntries[number].info.size;
201 }
202 return 0;
203}
204
205unsigned int
206TransferQueue::getDataAt(unsigned int number)
207{
208 if ((number >= 0) && (number < m_numEntries)) {
209 return m_pEntries[number].info.data;
210 }
211 return 0;
212}
213
214unsigned int
215TransferQueue::getFlagsAt(unsigned int number)
216{
217 if ((number >= 0) && (number < m_numEntries)) {
218 return m_pEntries[number].info.flags;
219 }
220 return 0;
221}
222
223bool
224TransferQueue::setSizeAt(unsigned int number, unsigned int value)
225{
226 if ((number >= 0) && (number < m_numEntries)) {
227 m_pEntries[number].info.size = value;
228 return true;
229 }
230 return false;
231}
232
233bool
234TransferQueue::setDataAt(unsigned int number, unsigned int value)
235{
236 if ((number >= 0) && (number < m_numEntries)) {
237 m_pEntries[number].info.data = value;
238 return true;
239 }
240 return false;
241}
242
243bool
244TransferQueue::setFlagsAt(unsigned int number, unsigned int value)
245{
246 if ((number >= 0) && (number < m_numEntries)) {
247 m_pEntries[number].info.flags = m_pEntries[number].info.flags | value;
248 return true;
249 }
250 return false;
251}
252
253bool
254TransferQueue::clearFlagAt(unsigned int number, unsigned int value)
255{
256 if ((number >= 0) && (number < m_numEntries)) {
257 m_pEntries[number].info.flags = (m_pEntries[number].info.flags & (value ^ 0xFFFFFFFF));
258 return true;
259 }
260 return false;
261}
262
263bool
264TransferQueue::setFlagToAll(unsigned int flag)
265{
266 for (unsigned int i = 0; i < m_numEntries; i++) {
267 setFlagsAt(i, flag);
268 }
269 return true;
270}
271
272bool
273TransferQueue::deleteAt(unsigned int number)
274{
275 if ((number >= m_numEntries) || (number < 0)) return false;
276
277 FILEINFOEX *pTemporary = new FILEINFOEX[m_numEntries - 1];
278
279 if (number == 0) {
280 memcpy(pTemporary, &m_pEntries[1], (m_numEntries - 1) * sizeof(FILEINFOEX));
281 } else {
282 memcpy(pTemporary, m_pEntries, number * sizeof(FILEINFOEX));
283 if (number != (m_numEntries - 1))
284 memcpy(&pTemporary[number], &m_pEntries[number + 1], (m_numEntries - number - 1) * sizeof(FILEINFOEX));
285 }
286
287 if (m_pEntries != NULL) {
288 delete [] m_pEntries;
289 m_pEntries = NULL;
290 }
291 m_pEntries = pTemporary;
292 pTemporary = NULL;
293 m_numEntries--;
294 return true;
295}
296
297unsigned int
298TransferQueue::getNumEntries()
299{
300 return m_numEntries;
301}
302
303void
304TransferQueue::free()
305{
306 if (m_pEntries != NULL) {
307 delete [] m_pEntries;
308 m_pEntries = NULL;
309 }
310 m_numEntries = 0;
311}