source: trunk/libtransmission/torrent.h @ 7147

Last change on this file since 7147 was 7147, checked in by charles, 13 years ago

(libT) #1468: another stab at getting the peer transfer speeds both fast and a little more consistent.

  • Property svn:keywords set to Date Rev Author Id
File size: 8.4 KB
Line 
1/******************************************************************************
2 * $Id: torrent.h 7147 2008-11-24 04:21:23Z charles $
3 *
4 * Copyright (c) 2005-2008 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#ifndef TR_TORRENT_H
26#define TR_TORRENT_H 1
27
28struct tr_bandwidth;
29struct tr_ratecontrol;
30
31/**
32***  Package-visible ctor API
33**/
34
35void        tr_ctorSetSave( tr_ctor * ctor,
36                            int       saveMetadataInOurTorrentsDir );
37
38int         tr_ctorGetSave( const tr_ctor * ctor );
39
40/**
41***
42**/
43
44/* just like tr_torrentSetFileDLs but doesn't trigger a fastresume save */
45void        tr_torrentInitFileDLs( tr_torrent *      tor,
46                                   tr_file_index_t * files,
47                                   tr_file_index_t   fileCount,
48                                   int               do_download );
49
50int         tr_torrentIsPrivate( const tr_torrent * );
51
52void        tr_torrentRecheckCompleteness( tr_torrent * );
53
54void        tr_torrentResetTransferStats( tr_torrent * );
55
56void        tr_torrentSetHasPiece( tr_torrent *     tor,
57                                   tr_piece_index_t pieceIndex,
58                                   int              has );
59
60void        tr_torrentLock( const tr_torrent * session );
61
62void        tr_torrentUnlock( const tr_torrent * session );
63
64int         tr_torrentIsSeed( const tr_torrent * session );
65
66void        tr_torrentChangeMyPort( tr_torrent * session );
67
68int         tr_torrentExists( const tr_session * session,
69                              const uint8_t    * hash );
70
71tr_torrent* tr_torrentFindFromId( tr_session * session,
72                                  int          id );
73
74tr_torrent* tr_torrentFindFromHash( tr_session *    session,
75                                    const uint8_t * hash );
76
77tr_torrent* tr_torrentFindFromHashString( tr_session * session,
78                                          const char * hashString );
79
80tr_torrent* tr_torrentFindFromObfuscatedHash( tr_session    * session,
81                                              const uint8_t * hash );
82
83int         tr_torrentAllowsPex( const tr_torrent * );
84
85int         tr_torrentIsPieceTransferAllowed( const tr_torrent * torrent,
86                                              tr_direction       direction );
87
88/* get the index of this piece's first block */
89#define tr_torPieceFirstBlock( tor, piece ) ( ( piece ) *\
90                                             ( tor )->blockCountInPiece )
91
92/* what piece index is this block in? */
93#define tr_torBlockPiece( tor, block ) ( ( block ) /\
94                                        ( tor )->blockCountInPiece )
95
96/* how many blocks are in this piece? */
97#define tr_torPieceCountBlocks( tor, piece ) \
98    ( ( ( piece ) ==\
99       ( ( tor )->info.pieceCount - \
100        1 ) ) ? ( tor )->blockCountInLastPiece : ( tor )->blockCountInPiece )
101
102/* how many bytes are in this piece? */
103#define tr_torPieceCountBytes( tor, piece ) \
104    ( ( ( piece ) ==\
105       ( ( tor )->info.pieceCount - \
106        1 ) ) ? ( tor )->lastPieceSize : ( tor )->info.pieceSize )
107
108/* how many bytes are in this block? */
109#define tr_torBlockCountBytes( tor, block ) \
110    ( ( ( block ) ==\
111       ( ( tor )->blockCount - \
112        1 ) ) ? ( tor )->lastBlockSize : ( tor )->blockSize )
113
114#define tr_block( a, b ) _tr_block( tor, a, b )
115tr_block_index_t _tr_block( const tr_torrent * tor,
116                            tr_piece_index_t   index,
117                            uint32_t           offset );
118
119int              tr_torrentReqIsValid( const tr_torrent * tor,
120                                       tr_piece_index_t   index,
121                                       uint32_t           offset,
122                                       uint32_t           length );
123
124uint64_t         tr_pieceOffset( const tr_torrent * tor,
125                                 tr_piece_index_t   index,
126                                 uint32_t           offset,
127                                 uint32_t           length );
128
129void             tr_torrentInitFilePriority( tr_torrent       * tor,
130                                             tr_file_index_t    fileIndex,
131                                             tr_priority_t      priority );
132
133
134int              tr_torrentCountUncheckedPieces( const tr_torrent * );
135
136int              tr_torrentIsPieceChecked( const tr_torrent  * tor,
137                                           tr_piece_index_t    piece );
138
139int              tr_torrentIsFileChecked( const tr_torrent  * tor,
140                                          tr_file_index_t     file );
141
142void             tr_torrentSetPieceChecked( tr_torrent       * tor,
143                                            tr_piece_index_t   piece,
144                                            int                isChecked );
145
146void             tr_torrentSetFileChecked( tr_torrent       * tor,
147                                           tr_file_index_t    file,
148                                           int                isChecked );
149
150void             tr_torrentUncheck( tr_torrent * tor );
151
152int              tr_torrentPromoteTracker( tr_torrent   * tor,
153                                           int            trackerIndex );
154
155time_t*          tr_torrentGetMTimes( const tr_torrent  * tor,
156                                      size_t            * setmeCount );
157
158typedef enum
159{
160    TR_VERIFY_NONE,
161    TR_VERIFY_WAIT,
162    TR_VERIFY_NOW
163}
164tr_verify_state;
165
166struct tr_torrent
167{
168    tr_session *             session;
169    tr_info                  info;
170
171    int                      uploadLimit;
172    tr_speedlimit            uploadLimitMode;
173    int                      downloadLimit;
174    tr_speedlimit            downloadLimitMode;
175
176    struct tr_ratecontrol *  swarmSpeed;
177
178    int                      error;
179    char                     errorString[128];
180
181    uint8_t                  obfuscatedHash[SHA_DIGEST_LENGTH];
182
183    /* Where to download */
184    char *  downloadDir;
185
186    /* How many bytes we ask for per request */
187    uint32_t                   blockSize;
188    tr_block_index_t           blockCount;
189
190    uint32_t                   lastBlockSize;
191    uint32_t                   lastPieceSize;
192
193    uint32_t                   blockCountInPiece;
194    uint32_t                   blockCountInLastPiece;
195
196    struct tr_completion *     completion;
197
198    struct tr_bitfield *       checkedPieces;
199    tr_completeness            completeness;
200
201    struct tr_tracker *        tracker;
202    struct tr_publisher_tag *  trackerSubscription;
203
204    uint64_t                   downloadedCur;
205    uint64_t                   downloadedPrev;
206    uint64_t                   uploadedCur;
207    uint64_t                   uploadedPrev;
208    uint64_t                   corruptCur;
209    uint64_t                   corruptPrev;
210
211    time_t                     addedDate;
212    time_t                     activityDate;
213    time_t                     doneDate;
214    time_t                     startDate;
215
216    tr_torrent_completeness_func *   completeness_func;
217    void *                     completeness_func_user_data;
218
219    unsigned int               isRunning  : 1;
220    unsigned int               isDeleting : 1;
221
222    uint16_t                   maxConnectedPeers;
223
224    tr_verify_state            verifyState;
225
226    time_t                     lastStatTime;
227    tr_stat                    stats;
228
229    tr_torrent *               next;
230
231    int                        uniqueId;
232
233    struct tr_bandwidth      * bandwidth[2];
234};
235
236#endif
Note: See TracBrowser for help on using the repository browser.