source: trunk/libtransmission/torrent-ctor.c @ 6903

Last change on this file since 6903 was 6903, checked in by charles, 14 years ago

(libT) a few more win32 portability changes from Spry

  • Property svn:keywords set to Date Rev Author Id
File size: 7.0 KB
Line 
1/*
2 * This file Copyright (C) 2007-2008 Charles Kerr <charles@rebelbase.com>
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: torrent-ctor.c 6903 2008-10-14 17:57:44Z charles $
11 */
12
13#include <errno.h>
14#include "transmission.h"
15#include "bencode.h"
16#include "platform.h"
17#include "session.h" /* tr_sessionFindTorrentFile */
18#include "utils.h"
19
20#define DEFAULT_MAX_CONNECTED_PEERS 50
21
22struct optional_args
23{
24    unsigned int    isSet_paused      : 1;
25    unsigned int    isSet_connected   : 1;
26    unsigned int    isSet_downloadDir : 1;
27
28    unsigned int    isPaused          : 1;
29    uint16_t        peerLimit;
30    char          * downloadDir;
31};
32
33/** Opaque class used when instantiating torrents.
34 * @ingroup tr_ctor */
35struct tr_ctor
36{
37    const tr_handle *       handle;
38    unsigned int            saveInOurTorrentsDir : 1;
39    unsigned int            doDelete             : 1;
40
41    unsigned int            isSet_metainfo       : 1;
42    unsigned int            isSet_delete         : 1;
43    tr_benc                 metainfo;
44    char *                  sourceFile;
45
46    struct optional_args    optionalArgs[2];
47};
48
49/***
50****
51***/
52
53static void
54setSourceFile( tr_ctor *    ctor,
55               const char * sourceFile )
56{
57    tr_free( ctor->sourceFile );
58    ctor->sourceFile = tr_strdup( sourceFile );
59}
60
61static void
62clearMetainfo( tr_ctor * ctor )
63{
64    if( ctor->isSet_metainfo )
65    {
66        ctor->isSet_metainfo = 0;
67        tr_bencFree( &ctor->metainfo );
68    }
69
70    setSourceFile( ctor, NULL );
71}
72
73int
74tr_ctorSetMetainfo( tr_ctor *       ctor,
75                    const uint8_t * metainfo,
76                    size_t          len )
77{
78    int err;
79
80    clearMetainfo( ctor );
81    err = tr_bencLoad( metainfo, len, &ctor->metainfo, NULL );
82    ctor->isSet_metainfo = !err;
83    return err;
84}
85
86const char*
87tr_ctorGetSourceFile( const tr_ctor * ctor )
88{
89    return ctor->sourceFile;
90}
91
92int
93tr_ctorSetMetainfoFromFile( tr_ctor *    ctor,
94                            const char * filename )
95{
96    uint8_t * metainfo;
97    size_t    len;
98    int       err;
99
100    metainfo = tr_loadFile( filename, &len );
101    if( metainfo && len )
102        err = tr_ctorSetMetainfo( ctor, metainfo, len );
103    else
104    {
105        clearMetainfo( ctor );
106        err = 1;
107    }
108
109    setSourceFile( ctor, filename );
110
111    /* if no `name' field was set, then set it from the filename */
112    if( ctor->isSet_metainfo )
113    {
114        tr_benc * info;
115        if( tr_bencDictFindDict( &ctor->metainfo, "info", &info ) )
116        {
117            const char * name;
118            if( !tr_bencDictFindStr( info, "name.utf-8", &name ) )
119                if( !tr_bencDictFindStr( info, "name", &name ) )
120                    name = NULL;
121            if( !name || !*name )
122            {
123                char * base = tr_basename( filename );
124                tr_bencDictAddStr( info, "name", base );
125                tr_free( base );
126            }
127        }
128    }
129
130    tr_free( metainfo );
131    return err;
132}
133
134int
135tr_ctorSetMetainfoFromHash( tr_ctor *    ctor,
136                            const char * hashString )
137{
138    int          err;
139    const char * filename;
140
141    filename = tr_sessionFindTorrentFile( ctor->handle, hashString );
142    if( !filename )
143        err = EINVAL;
144    else
145        err = tr_ctorSetMetainfoFromFile( ctor, filename );
146
147    return err;
148}
149
150/***
151****
152***/
153
154void
155tr_ctorSetDeleteSource( tr_ctor * ctor,
156                        uint8_t   deleteSource )
157{
158    ctor->doDelete = deleteSource ? 1 : 0;
159    ctor->isSet_delete = 1;
160}
161
162int
163tr_ctorGetDeleteSource( const tr_ctor * ctor,
164                        uint8_t *       setme )
165{
166    int err = 0;
167
168    if( !ctor->isSet_delete )
169        err = 1;
170    else if( setme )
171        *setme = ctor->doDelete ? 1 : 0;
172
173    return err;
174}
175
176/***
177****
178***/
179
180void
181tr_ctorSetSave( tr_ctor * ctor,
182                int       saveInOurTorrentsDir )
183{
184    ctor->saveInOurTorrentsDir = saveInOurTorrentsDir ? 1 : 0;
185}
186
187int
188tr_ctorGetSave( const tr_ctor * ctor )
189{
190    return ctor && ctor->saveInOurTorrentsDir;
191}
192
193void
194tr_ctorSetPaused( tr_ctor *   ctor,
195                  tr_ctorMode mode,
196                  uint8_t     isPaused )
197{
198    struct optional_args * args = &ctor->optionalArgs[mode];
199
200    args->isSet_paused = 1;
201    args->isPaused = isPaused ? 1 : 0;
202}
203
204void
205tr_ctorSetPeerLimit( tr_ctor *   ctor,
206                     tr_ctorMode mode,
207                     uint16_t    peerLimit )
208{
209    struct optional_args * args = &ctor->optionalArgs[mode];
210
211    args->isSet_connected = 1;
212    args->peerLimit = peerLimit;
213}
214
215void
216tr_ctorSetDownloadDir( tr_ctor *    ctor,
217                       tr_ctorMode  mode,
218                       const char * directory )
219{
220    struct optional_args * args = &ctor->optionalArgs[mode];
221
222    tr_free( args->downloadDir );
223    args->downloadDir = NULL;
224    args->isSet_downloadDir = 0;
225
226    if( directory )
227    {
228        args->isSet_downloadDir = 1;
229        args->downloadDir = tr_strdup( directory );
230    }
231}
232
233int
234tr_ctorGetPeerLimit( const tr_ctor * ctor,
235                     tr_ctorMode     mode,
236                     uint16_t *      setmeCount )
237{
238    int                          err = 0;
239    const struct optional_args * args = &ctor->optionalArgs[mode];
240
241    if( !args->isSet_connected )
242        err = 1;
243    else if( setmeCount )
244        *setmeCount = args->peerLimit;
245
246    return err;
247}
248
249int
250tr_ctorGetPaused( const tr_ctor * ctor,
251                  tr_ctorMode     mode,
252                  uint8_t *       setmeIsPaused )
253{
254    int                          err = 0;
255    const struct optional_args * args = &ctor->optionalArgs[mode];
256
257    if( !args->isSet_paused )
258        err = 1;
259    else if( setmeIsPaused )
260        *setmeIsPaused = args->isPaused ? 1 : 0;
261
262    return err;
263}
264
265int
266tr_ctorGetDownloadDir( const tr_ctor * ctor,
267                       tr_ctorMode     mode,
268                       const char **   setmeDownloadDir )
269{
270    int                          err = 0;
271    const struct optional_args * args = &ctor->optionalArgs[mode];
272
273    if( !args->isSet_downloadDir )
274        err = 1;
275    else if( setmeDownloadDir )
276        *setmeDownloadDir = args->downloadDir;
277
278    return err;
279}
280
281int
282tr_ctorGetMetainfo( const tr_ctor *  ctor,
283                    const tr_benc ** setme )
284{
285    int err = 0;
286
287    if( !ctor->isSet_metainfo )
288        err = 1;
289    else if( setme )
290        *setme = &ctor->metainfo;
291
292    return err;
293}
294
295/***
296****
297***/
298
299tr_ctor*
300tr_ctorNew( const tr_handle * handle )
301{
302    tr_ctor * ctor = tr_new0( struct tr_ctor, 1 );
303
304    ctor->handle = handle;
305    tr_ctorSetPeerLimit( ctor, TR_FALLBACK, DEFAULT_MAX_CONNECTED_PEERS );
306    tr_ctorSetPaused( ctor, TR_FALLBACK, FALSE );
307    tr_ctorSetDownloadDir( ctor, TR_FALLBACK, handle->downloadDir );
308    tr_ctorSetSave( ctor, TRUE );
309    return ctor;
310}
311
312void
313tr_ctorFree( tr_ctor * ctor )
314{
315    clearMetainfo( ctor );
316    tr_free( ctor->optionalArgs[1].downloadDir );
317    tr_free( ctor->optionalArgs[0].downloadDir );
318    tr_free( ctor );
319}
320
Note: See TracBrowser for help on using the repository browser.