1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
/***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* [email protected] *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef BTCHUNK_H
#define BTCHUNK_H
#include <util/constants.h>
#include "cachefile.h"
namespace bt
{
class SHA1Hash;
/**
* @author Joris Guisson
* @brief Keep track of a piece of the file
*
* Keeps track of a piece of the file. The Chunk has 3 possible states :
* - MMAPPED : It is memory mapped
* - BUFFERED : It is in a buffer in dynamically allocated memory
* (because the chunk is located in 2 or more separate files, so we cannot just set a pointer
* to a region of mmapped memory)
* - ON_DISK : On disk
* - NOT_DOWNLOADED : It hasn't been dowloaded yet, and there is no buffer allocated
*/
class Chunk : public MMappeable
{
public:
Chunk(unsigned int index,Uint32 size);
~Chunk();
enum tqStatus
{
MMAPPED,
BUFFERED,
ON_DISK,
NOT_DOWNLOADED
};
/// Get the chunks status.
tqStatus gettqStatus() const;
/**
* Set the chunks status
* @param s
*/
void settqStatus(tqStatus s);
/// Get the data
const Uint8* getData() const;
/// Get the data
Uint8* getData();
/// Set the data and the new status
void setData(Uint8* d,tqStatus nstatus);
/// Clear the chunk (delete data depending on the mode)
void clear();
/// Get the chunk's index
Uint32 getIndex() const;
/// Get the chunk's size
Uint32 getSize() const;
/// Add one to the reference counter
void ref();
/// --reference counter
void unref();
/// reference coun > 0
bool taken() const;
/// allocate data if not already done, sets the status to buffered
void allocate();
/// get chunk priority
Priority getPriority() const;
/// set chunk priority
void setPriority(Priority newpriority = NORMAL_PRIORITY);
/// Is chunk excluded
bool isExcluded() const;
/// Is this a seed only chunk
bool isExcludedForDownloading() const;
/// In/Exclude chunk
void setExclude(bool yes);
/**
* Check wehter the chunk matches it's hash.
* @param h The hash
* @return true if the data matches the hash
*/
bool checkHash(const SHA1Hash & h) const;
private:
virtual void unmapped();
private:
tqStatus status;
Uint32 index;
Uint8* data;
Uint32 size;
int ref_count;
Priority priority;
};
inline Chunk::tqStatus Chunk::gettqStatus() const
{
return status;
}
inline void Chunk::settqStatus(Chunk::tqStatus s)
{
status = s;
}
inline const Uint8* Chunk::getData() const {return data;}
inline Uint8* Chunk::getData() {return data;}
inline Uint32 Chunk::getIndex() const {return index;}
inline Uint32 Chunk::getSize() const {return size;}
inline void Chunk::ref() {ref_count++;}
inline void Chunk::unref() {ref_count--;}
inline bool Chunk::taken() const {return ref_count > 0;}
inline Priority Chunk::getPriority() const {return priority;}
inline void Chunk::setPriority(Priority newpriority) {priority = newpriority;}
inline bool Chunk::isExcluded() const
{
return priority == EXCLUDED;
}
inline bool Chunk::isExcludedForDownloading() const
{
return priority == ONLY_SEED_PRIORITY;
}
inline void Chunk::setExclude(bool yes)
{if(yes) priority = EXCLUDED; else priority = NORMAL_PRIORITY;}
}
#endif
|