108 lines
4.6 KiB
C
108 lines
4.6 KiB
C
/*
|
|
* Copyright (c) 2002-2004 Niels Provos <provos@citi.umich.edu>
|
|
* All rights reserved.
|
|
*
|
|
* Transmission modifications and new bugs by Charles Kerr.
|
|
* Source: libevent's "patches-1.4" branch, svn revision 949
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __TRANSMISSION__
|
|
#error only libtransmission should #include this header.
|
|
#endif
|
|
|
|
#ifndef TR_EVBUFFER_H
|
|
#define TR_EVBUFFER_H
|
|
|
|
/**
|
|
* tr_iobuf is an i/o convenience wrapper similar to libevent's "bufferevent".
|
|
* it provides two evbuffers, one for writing and one for reading, and handles
|
|
* pumping them to/from the given fd.
|
|
*
|
|
* this class differs from bufferevent in two major ways:
|
|
* 1. the action callbacks include the number of bytes transferred
|
|
* 2. the up/down speeds are directly constrained by our `bandwidth' object
|
|
* 3. the implementation is hidden in the .c file
|
|
*/
|
|
struct tr_iobuf;
|
|
|
|
struct evbuffer;
|
|
struct tr_bandwidth;
|
|
struct tr_session;
|
|
|
|
/** @brief returns the input evbuffer to that we can read from */
|
|
struct evbuffer* tr_iobuf_input( struct tr_iobuf * iobuf );
|
|
|
|
/** @brief returns the output evbuffer that we can write to */
|
|
struct evbuffer* tr_iobuf_output( struct tr_iobuf * iobuf );
|
|
|
|
/** @brief prototype for the callbacks invoked when bytes have been read or written
|
|
@see tr_iobuf_new
|
|
@see tr_iobuf_setcb */
|
|
typedef void (*tr_iobuf_cb)( struct tr_iobuf*, size_t bytes_transferred, void* );
|
|
|
|
/** @brief prototype for the callback invoked on error
|
|
@see tr_iobuf_new
|
|
@see tr_iobuf_setcb */
|
|
typedef void (*tr_iobuf_error_cb)( struct tr_iobuf*, short what, void* );
|
|
|
|
/** @brief create a new tr_iobuf object. */
|
|
struct tr_iobuf* tr_iobuf_new( struct tr_handle * session,
|
|
struct tr_bandwidth * bandwidth,
|
|
int fd,
|
|
short event,
|
|
tr_iobuf_cb readcb,
|
|
tr_iobuf_cb writecb,
|
|
tr_iobuf_error_cb errorcb,
|
|
void * cbarg );
|
|
|
|
/** @brief destroy a tr_iobuf object. */
|
|
void tr_iobuf_free( struct tr_iobuf * iobuf );
|
|
|
|
/** @brief change the number of seconds it takes for a read/write to timeout */
|
|
void tr_iobuf_settimeout( struct tr_iobuf * iobuf,
|
|
int timeout_read,
|
|
int timeout_write );
|
|
|
|
/** @brief set the bandwidth object that limits this iobuf's read/write speeds */
|
|
void tr_iobuf_set_bandwidth( struct tr_iobuf * iobuf,
|
|
struct tr_bandwidth * bandwidth );
|
|
|
|
/** @brief change the callbacks invoked by this iobuf on error and bytes transferred */
|
|
void tr_iobuf_setcb( struct tr_iobuf * iobuf,
|
|
tr_iobuf_cb readcb,
|
|
tr_iobuf_cb writecb,
|
|
tr_iobuf_error_cb errorcb,
|
|
void * cbarg );
|
|
|
|
/** @brief tell the iobuf to poll for certain states.
|
|
@brief event may be EV_READ, EV_WRITE, or EV_READ|EV_WRITE */
|
|
int tr_iobuf_enable( struct tr_iobuf * iobuf, short event );
|
|
|
|
/** @brief tell the iobuf to stop polling for certain states.
|
|
@brief event may be EV_READ, EV_WRITE, or EV_READ|EV_WRITE */
|
|
int tr_iobuf_disable( struct tr_iobuf * iobuf, short event );
|
|
|
|
#endif
|