~ubuntu-branches/ubuntu/lucid/transmission/lucid

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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
/*
 * This file Copyright (C) 2008-2010 Mnemosyne LLC
 *
 * This file is licensed by the GPL version 2.  Works owned by the
 * Transmission project are granted a special exemption to clause 2(b)
 * so that the bulk of its code can remain under the MIT license.
 * This exemption does not extend to derived works not owned by
 * the Transmission project.
 *
 * $Id: session.h 10276 2010-02-23 07:20:57Z charles $
 */

#ifndef __TRANSMISSION__
 #error only libtransmission should #include this header.
#endif

#ifndef TR_INTERNAL_H
#define TR_INTERNAL_H 1

#define TR_NAME "Transmission"

#ifndef UNUSED
 #ifdef __GNUC__
  #define UNUSED __attribute__ ( ( unused ) )
 #else
  #define UNUSED
 #endif
#endif

#include "bencode.h"

typedef enum { TR_NET_OK, TR_NET_ERROR, TR_NET_WAIT } tr_tristate_t;

uint8_t*       tr_peerIdNew( void );

const uint8_t* tr_getPeerId( void );

struct tr_address;
struct tr_announcer;
struct tr_bandwidth;
struct tr_bindsockets;
struct tr_fdInfo;

/**
 * How clock mode works:
 *
 * ._nextChangeAt, ._nextChangeValue and ._nextChangeAllowed are private fields
 * that are derived from .days, .beginMinute, .endMinute and the current time.
 * They're rebuilt when either (a) the user changes the clock settings or
 * (b) when the time at ._nextChangeAt is reached.
 *
 * When ._nextChangeAt is reached, if .isClockEnabled and ._nextChangeAllowed
 * are both true, then turtle mode's flag is set to ._nextChangeValue.
 */
struct tr_turtle_info
{
    /* TR_UP and TR_DOWN speed limits */
    int speedLimit[2];

    /* is turtle mode on right now? */
    tr_bool isEnabled;

    /* does turtle mode turn itself on and off at given times? */
    tr_bool isClockEnabled;

    /* when clock mode is on, minutes after midnight to turn on turtle mode */
    int beginMinute;

    /* when clock mode is on, minutes after midnight to turn off turtle mode */
    int endMinute;

    /* only use clock mode on these days of the week */
    tr_sched_day days;

    /* called when isEnabled changes */
    tr_altSpeedFunc * callback;

    /* the callback's user_data argument */
    void * callbackUserData;

    /* the callback's changedByUser argument.
     * indicates whether the change came from the user or from the clock. */
    tr_bool changedByUser;

    /* this is the next time the clock will set turtle mode */
    time_t _nextChangeAt;

    /* the clock will set turtle mode to this flag. */
    tr_bool _nextChangeValue;

    /* When clock mode is on, only toggle turtle mode if this is true.
     * This flag is used to filter out changes that fall on days when
     * clock mode is disabled. */
    tr_bool _nextChangeAllowed;

    /* The last time the clock tested to see if _nextChangeAt was reached */
    time_t testedAt;
};

/** @brief handle to an active libtransmission session */
struct tr_session
{
    tr_bool                      isPortRandom;
    tr_bool                      isPexEnabled;
    tr_bool                      isDHTEnabled;
    tr_bool                      isBlocklistEnabled;
    tr_bool                      isProxyEnabled;
    tr_bool                      isProxyAuthEnabled;
    tr_bool                      isClosed;
    tr_bool                      useLazyBitfield;
    tr_bool                      isIncompleteFileNamingEnabled;
    tr_bool                      isRatioLimited;
    tr_bool                      isIncompleteDirEnabled;

    tr_benc                      removedTorrents;

    int                          umask;

    int                          speedLimit[2];
    tr_bool                      speedLimitEnabled[2];

    struct tr_turtle_info        turtle;

    struct tr_fdInfo           * fdInfo;

    int                          magicNumber;

    tr_encryption_mode           encryptionMode;

    tr_preallocation_mode        preallocationMode;

    struct tr_event_handle *     events;

    uint16_t                     peerLimitPerTorrent;

    int                          uploadSlotsPerTorrent;

    tr_port                      peerPort;
    tr_port                      randomPortLow;
    tr_port                      randomPortHigh;

    int                          proxyPort;
    int                          peerSocketTOS;

    int                          torrentCount;
    tr_torrent *                 torrentList;

    char *                       tag;
    char *                       configDir;
    char *                       downloadDir;
    char *                       resumeDir;
    char *                       torrentDir;
    char *                       incompleteDir;

    tr_proxy_type                proxyType;
    char *                       proxy;
    char *                       proxyUsername;
    char *                       proxyPassword;

    struct tr_list *             blocklists;
    struct tr_peerMgr *          peerMgr;
    struct tr_shared *           shared;

    struct tr_lock *             lock;

    struct tr_web *              web;

    struct tr_rpc_server *       rpcServer;
    tr_rpc_func                  rpc_func;
    void *                       rpc_func_user_data;

    struct tr_stats_handle     * sessionStats;

    struct tr_announcer        * announcer;

    tr_benc                    * metainfoLookup;

    struct event               * nowTimer;
    struct event               * saveTimer;

    /* monitors the "global pool" speeds */
    struct tr_bandwidth        * bandwidth;

    double                       desiredRatio;

    struct tr_bindinfo         * public_ipv4;
    struct tr_bindinfo         * public_ipv6;

    /* a page-aligned buffer for use by the libtransmission thread.
     * @see SESSION_BUFFER_SIZE */
    void * buffer;

    tr_bool bufferInUse;
};

tr_bool      tr_sessionAllowsDHT( const tr_session * session );

const char * tr_sessionFindTorrentFile( const tr_session * session,
                                        const char *       hashString );

void         tr_sessionSetTorrentFile( tr_session * session,
                                       const char * hashString,
                                       const char * filename );

tr_bool      tr_sessionIsAddressBlocked( const tr_session        * session,
                                         const struct tr_address * addr );

void         tr_sessionLock( tr_session * );

void         tr_sessionUnlock( tr_session * );

tr_bool      tr_sessionIsLocked( const tr_session * );

const struct tr_address*  tr_sessionGetPublicAddress( const tr_session *, int tr_af_type );

struct tr_bindsockets * tr_sessionGetBindSockets( tr_session * );

enum
{
    SESSION_MAGIC_NUMBER = 3845,

    /* @see tr_session.buffer */
    SESSION_BUFFER_SIZE = (16*1024)
};

void* tr_sessionGetBuffer( tr_session * session );

void tr_sessionReleaseBuffer( tr_session * session );

static inline tr_bool tr_isSession( const tr_session * session )
{
    return ( session != NULL ) && ( session->magicNumber == SESSION_MAGIC_NUMBER );
}

static inline tr_bool tr_isPreallocationMode( tr_preallocation_mode m  )
{
    return ( m == TR_PREALLOCATE_NONE )
        || ( m == TR_PREALLOCATE_SPARSE )
        || ( m == TR_PREALLOCATE_FULL );
}

static inline tr_bool tr_isEncryptionMode( tr_encryption_mode m )
{
    return ( m == TR_CLEAR_PREFERRED )
        || ( m == TR_ENCRYPTION_PREFERRED )
        || ( m == TR_ENCRYPTION_REQUIRED );
}

static inline tr_bool tr_isPriority( tr_priority_t p )
{
    return ( p == TR_PRI_LOW )
        || ( p == TR_PRI_NORMAL )
        || ( p == TR_PRI_HIGH );
}

#endif