source: trunk/libtransmission/peer-io.h @ 11709

Last change on this file since 11709 was 11709, checked in by jordan, 11 years ago

Update the copyright year in the source code comments.

The Berne Convention says that the copyright year is moot, so instead of adding another year to each file as in previous years, I've removed the year altogether from the source code comments in libtransmission, gtk, qt, utils, daemon, and cli.

Juliusz's copyright notice in tr-dht and Johannes' copyright notice in tr-lpd have been left alone; it didn't seem appropriate to modify them.

  • Property svn:keywords set to Date Rev Author Id
File size: 10.1 KB
Line 
1/*
2 * This file Copyright (C) Mnemosyne LLC
3 *
4 * This file is licensed by the GPL version 2. Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: peer-io.h 11709 2011-01-19 13:48:47Z jordan $
11 */
12
13#ifndef __TRANSMISSION__
14#error only libtransmission should #include this header.
15#endif
16
17#ifndef TR_PEER_IO_H
18#define TR_PEER_IO_H
19
20/**
21***
22**/
23
24#include <assert.h>
25
26#include <event2/buffer.h>
27#include <event2/event.h>
28
29#include "transmission.h"
30#include "bandwidth.h"
31#include "list.h" /* tr_list */
32#include "net.h" /* tr_address */
33#include "utils.h" /* tr_time() */
34
35struct evbuffer;
36struct tr_bandwidth;
37struct tr_crypto;
38struct tr_peerIo;
39
40/**
41 * @addtogroup networked_io Networked IO
42 * @{
43 */
44
45typedef enum
46{
47    READ_NOW,
48    READ_LATER,
49    READ_ERR
50}
51ReadState;
52
53typedef ReadState ( *tr_can_read_cb  )( struct tr_peerIo * io,
54                                        void             * user_data,
55                                        size_t           * setme_piece_byte_count );
56
57typedef void      ( *tr_did_write_cb )( struct tr_peerIo * io,
58                                        size_t             bytesWritten,
59                                        int                wasPieceData,
60                                        void             * userData );
61
62typedef void      ( *tr_net_error_cb )( struct tr_peerIo * io,
63                                        short              what,
64                                        void             * userData );
65
66typedef struct tr_peerIo
67{
68    tr_bool               isEncrypted;
69    tr_bool               isIncoming;
70    tr_bool               peerIdIsSet;
71    tr_bool               extendedProtocolSupported;
72    tr_bool               fastExtensionSupported;
73    tr_bool               dhtSupported;
74
75    tr_priority_t         priority;
76
77    short int             pendingEvents;
78
79    int                   magicNumber;
80
81    uint32_t              encryptionMode;
82    tr_bool               isSeed;
83
84    tr_port               port;
85    int                   socket;
86
87    int                   refCount;
88
89    uint8_t               peerId[SHA_DIGEST_LENGTH];
90    time_t                timeCreated;
91
92    tr_session          * session;
93
94    tr_address            addr;
95
96    tr_can_read_cb        canRead;
97    tr_did_write_cb       didWrite;
98    tr_net_error_cb       gotError;
99    void *                userData;
100
101    struct tr_bandwidth   bandwidth;
102    struct tr_crypto    * crypto;
103
104    struct evbuffer     * inbuf;
105    struct evbuffer     * outbuf;
106    struct tr_list      * outbuf_datatypes; /* struct tr_datatype */
107
108    struct event        * event_read;
109    struct event        * event_write;
110}
111tr_peerIo;
112
113/**
114***
115**/
116
117tr_peerIo*  tr_peerIoNewOutgoing( tr_session              * session,
118                                  struct tr_bandwidth     * parent,
119                                  const struct tr_address * addr,
120                                  tr_port                   port,
121                                  const  uint8_t          * torrentHash,
122                                  tr_bool                   isSeed );
123
124tr_peerIo*  tr_peerIoNewIncoming( tr_session              * session,
125                                  struct tr_bandwidth     * parent,
126                                  const struct tr_address * addr,
127                                  tr_port                   port,
128                                  int                       socket );
129
130void tr_peerIoRefImpl           ( const char              * file,
131                                  int                       line,
132                                  tr_peerIo               * io );
133
134#define tr_peerIoRef(io) tr_peerIoRefImpl( __FILE__, __LINE__, (io) );
135
136void tr_peerIoUnrefImpl         ( const char              * file,
137                                  int                       line,
138                                  tr_peerIo               * io );
139
140#define tr_peerIoUnref(io) tr_peerIoUnrefImpl( __FILE__, __LINE__, (io) );
141
142tr_bool     tr_isPeerIo         ( const tr_peerIo         * io );
143
144
145/**
146***
147**/
148
149static inline void tr_peerIoEnableFEXT( tr_peerIo * io, tr_bool flag )
150{
151    io->fastExtensionSupported = flag;
152}
153static inline tr_bool tr_peerIoSupportsFEXT( const tr_peerIo * io )
154{
155    return io->fastExtensionSupported;
156}
157
158static inline void tr_peerIoEnableLTEP( tr_peerIo * io, tr_bool flag )
159{
160    io->extendedProtocolSupported = flag;
161}
162static inline tr_bool tr_peerIoSupportsLTEP( const tr_peerIo * io )
163{
164    return io->extendedProtocolSupported;
165}
166
167static inline void tr_peerIoEnableDHT( tr_peerIo * io, tr_bool flag )
168{
169    io->dhtSupported = flag;
170}
171static inline tr_bool tr_peerIoSupportsDHT( const tr_peerIo * io )
172{
173    return io->dhtSupported;
174}
175
176/**
177***
178**/
179
180static inline tr_session* tr_peerIoGetSession ( tr_peerIo * io )
181{
182    assert( tr_isPeerIo( io ) );
183    assert( io->session );
184
185    return io->session;
186}
187
188const char* tr_peerIoAddrStr( const struct tr_address * addr,
189                              tr_port                   port );
190
191const char* tr_peerIoGetAddrStr( const tr_peerIo * io );
192
193const struct tr_address * tr_peerIoGetAddress( const tr_peerIo * io,
194                                               tr_port         * port );
195
196const uint8_t*       tr_peerIoGetTorrentHash( tr_peerIo * io );
197
198int                  tr_peerIoHasTorrentHash( const tr_peerIo * io );
199
200void                 tr_peerIoSetTorrentHash( tr_peerIo *     io,
201                                              const uint8_t * hash );
202
203int                  tr_peerIoReconnect( tr_peerIo * io );
204
205static inline tr_bool tr_peerIoIsIncoming( const tr_peerIo * io )
206{
207    return io->isIncoming;
208}
209
210static inline int    tr_peerIoGetAge( const tr_peerIo * io )
211{
212    return tr_time() - io->timeCreated;
213}
214
215
216/**
217***
218**/
219
220void                 tr_peerIoSetPeersId( tr_peerIo *     io,
221                                          const uint8_t * peer_id );
222
223static inline const uint8_t* tr_peerIoGetPeersId( const tr_peerIo * io )
224{
225    assert( tr_isPeerIo( io ) );
226    assert( io->peerIdIsSet );
227
228    return io->peerId;
229}
230
231/**
232***
233**/
234
235void    tr_peerIoSetIOFuncs      ( tr_peerIo        * io,
236                                   tr_can_read_cb     readcb,
237                                   tr_did_write_cb    writecb,
238                                   tr_net_error_cb    errcb,
239                                   void             * user_data );
240
241void    tr_peerIoClear           ( tr_peerIo        * io );
242
243/**
244***
245**/
246
247void    tr_peerIoWriteBytes     ( tr_peerIo         * io,
248                                  const void        * writeme,
249                                  size_t              writemeLen,
250                                  tr_bool             isPieceData );
251
252void    tr_peerIoWriteBuf       ( tr_peerIo         * io,
253                                  struct evbuffer   * buf,
254                                  tr_bool             isPieceData );
255
256/**
257***
258**/
259
260static inline struct tr_crypto * tr_peerIoGetCrypto( tr_peerIo * io )
261{
262    return io->crypto;
263}
264
265typedef enum
266{
267    /* these match the values in MSE's crypto_select */
268    PEER_ENCRYPTION_NONE  = ( 1 << 0 ),
269    PEER_ENCRYPTION_RC4   = ( 1 << 1 )
270}
271EncryptionMode;
272
273void tr_peerIoSetEncryption( tr_peerIo * io, uint32_t encryptionMode );
274
275static inline tr_bool
276tr_peerIoIsEncrypted( const tr_peerIo * io )
277{
278    return ( io != NULL ) && ( io->encryptionMode == PEER_ENCRYPTION_RC4 );
279}
280
281static inline void
282evbuffer_add_uint8( struct evbuffer * outbuf, uint8_t byte )
283{
284    evbuffer_add( outbuf, &byte, 1 );
285}
286
287void evbuffer_add_uint16( struct evbuffer * outbuf, uint16_t hs );
288void evbuffer_add_uint32( struct evbuffer * outbuf, uint32_t hl );
289
290void tr_peerIoReadBytes( tr_peerIo        * io,
291                         struct evbuffer  * inbuf,
292                         void             * bytes,
293                         size_t             byteCount );
294
295static inline void tr_peerIoReadUint8( tr_peerIo        * io,
296                                          struct evbuffer  * inbuf,
297                                          uint8_t          * setme )
298{
299    tr_peerIoReadBytes( io, inbuf, setme, sizeof( uint8_t ) );
300}
301
302void tr_peerIoReadUint16( tr_peerIo        * io,
303                          struct evbuffer  * inbuf,
304                          uint16_t         * setme );
305
306void tr_peerIoReadUint32( tr_peerIo        * io,
307                          struct evbuffer  * inbuf,
308                          uint32_t         * setme );
309
310void      tr_peerIoDrain( tr_peerIo        * io,
311                          struct evbuffer  * inbuf,
312                          size_t             byteCount );
313
314/**
315***
316**/
317
318size_t    tr_peerIoGetWriteBufferSpace( const tr_peerIo * io, uint64_t now );
319
320static inline void tr_peerIoSetParent( tr_peerIo            * io,
321                                          struct tr_bandwidth  * parent )
322{
323    assert( tr_isPeerIo( io ) );
324
325    tr_bandwidthSetParent( &io->bandwidth, parent );
326}
327
328void      tr_peerIoBandwidthUsed( tr_peerIo           * io,
329                                  tr_direction          direction,
330                                  size_t                byteCount,
331                                  int                   isPieceData );
332
333static inline tr_bool
334tr_peerIoHasBandwidthLeft( const tr_peerIo * io, tr_direction dir )
335{
336    assert( tr_isPeerIo( io ) );
337
338    return tr_bandwidthClamp( &io->bandwidth, dir, 1024 ) > 0;
339}
340
341static inline unsigned int
342tr_peerIoGetPieceSpeed_Bps( const tr_peerIo * io, uint64_t now, tr_direction dir )
343{
344    assert( tr_isPeerIo( io ) );
345    assert( tr_isDirection( dir ) );
346
347    return tr_bandwidthGetPieceSpeed_Bps( &io->bandwidth, now, dir );
348}
349
350/**
351***
352**/
353
354void      tr_peerIoSetEnabled( tr_peerIo    * io,
355                               tr_direction   dir,
356                               tr_bool        isEnabled );
357
358int       tr_peerIoFlush( tr_peerIo     * io,
359                          tr_direction    dir,
360                          size_t          byteLimit );
361
362int       tr_peerIoFlushOutgoingProtocolMsgs( tr_peerIo * io );
363
364/**
365***
366**/
367
368static inline struct evbuffer * tr_peerIoGetReadBuffer( tr_peerIo * io )
369{
370    return io->inbuf;
371}
372
373/* @} */
374
375#endif
Note: See TracBrowser for help on using the repository browser.