****
***/
-void
-tr_bencToBuf( const tr_benc * top, tr_fmt_mode mode, struct evbuffer * buf )
+struct evbuffer *
+tr_bencToBuf( const tr_benc * top, tr_fmt_mode mode )
{
- evbuffer_drain( buf, evbuffer_get_length( buf ) );
+ struct evbuffer * buf = evbuffer_new( );
+
evbuffer_expand( buf, 4096 ); /* alloc a little memory to start off with */
switch( mode )
break;
}
}
+
+ return buf;
}
char*
tr_bencToStr( const tr_benc * top, tr_fmt_mode mode, int * len )
{
- char * ret;
- struct evbuffer * buf = evbuffer_new( );
- size_t n;
- tr_bencToBuf( top, mode, buf );
- n = evbuffer_get_length( buf );
- ret = evbuffer_free_to_str( buf );
+ struct evbuffer * buf = tr_bencToBuf( top, mode );
+ const size_t n = evbuffer_get_length( buf );
+ char * ret = evbuffer_free_to_str( buf );
if( len != NULL )
*len = (int) n;
return ret;
static void
tr_idle_function_done( struct tr_rpc_idle_data * data, const char * result )
{
- struct evbuffer * buf = evbuffer_new( );
+ struct evbuffer * buf;
if( result == NULL )
result = "success";
tr_bencDictAddStr( data->response, "result", result );
- tr_bencToBuf( data->response, TR_FMT_JSON_LEAN, buf );
+ buf = tr_bencToBuf( data->response, TR_FMT_JSON_LEAN );
(*data->callback)( data->session, buf, data->callback_user_data );
-
evbuffer_free( buf );
+
tr_bencFree( data->response );
tr_free( data->response );
tr_free( data );
{
int64_t tag;
tr_benc response;
- struct evbuffer * buf = evbuffer_new( );
+ struct evbuffer * buf;
tr_bencInitDict( &response, 3 );
tr_bencDictAddDict( &response, "arguments", 0 );
tr_bencDictAddStr( &response, "result", result );
if( tr_bencDictFindInt( request, "tag", &tag ) )
tr_bencDictAddInt( &response, "tag", tag );
- tr_bencToBuf( &response, TR_FMT_JSON_LEAN, buf );
- (*callback)( session, buf, callback_user_data );
+ buf = tr_bencToBuf( &response, TR_FMT_JSON_LEAN );
+ (*callback)( session, buf, callback_user_data );
evbuffer_free( buf );
+
tr_bencFree( &response );
}
else if( methods[i].immediate )
int64_t tag;
tr_benc response;
tr_benc * args_out;
- struct evbuffer * buf = evbuffer_new( );
+ struct evbuffer * buf;
tr_bencInitDict( &response, 3 );
args_out = tr_bencDictAddDict( &response, "arguments", 0 );
tr_bencDictAddStr( &response, "result", result );
if( tr_bencDictFindInt( request, "tag", &tag ) )
tr_bencDictAddInt( &response, "tag", tag );
- tr_bencToBuf( &response, TR_FMT_JSON_LEAN, buf );
- (*callback)( session, buf, callback_user_data );
+ buf = tr_bencToBuf( &response, TR_FMT_JSON_LEAN );
+ (*callback)( session, buf, callback_user_data );
evbuffer_free( buf );
+
tr_bencFree( &response );
}
else