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

Last change on this file since 8050 was 7658, checked in by charles, 13 years ago

(trunk) update the GPL code's copyright dates

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