1 /*
2  * This file Copyright (C) 2007-2014 Mnemosyne LLC
3  *
4  * It may be used under the GNU GPL versions 2 or 3
5  * or any future license endorsed by Mnemosyne LLC.
6  *
7  */
8 
9 #pragma once
10 
11 #ifdef __cplusplus
12 extern "C"
13 {
14 #endif
15 
16 typedef struct tr_metainfo_builder_file
17 {
18     char* filename;
19     uint64_t size;
20 }
21 tr_metainfo_builder_file;
22 
23 typedef enum
24 {
25     TR_MAKEMETA_OK,
26     TR_MAKEMETA_URL,
27     TR_MAKEMETA_CANCELLED,
28     TR_MAKEMETA_IO_READ, /* see builder.errfile, builder.my_errno */
29     TR_MAKEMETA_IO_WRITE /* see builder.errfile, builder.my_errno */
30 }
31 tr_metainfo_builder_err;
32 
33 typedef struct tr_metainfo_builder
34 {
35     /**
36     ***  These are set by tr_makeMetaInfoBuilderCreate()
37     ***  and cleaned up by tr_metaInfoBuilderFree()
38     **/
39 
40     char* top;
41     tr_metainfo_builder_file* files;
42     uint64_t totalSize;
43     uint32_t fileCount;
44     uint32_t pieceSize;
45     uint32_t pieceCount;
46     bool isFolder;
47 
48     /**
49     ***  These are set inside tr_makeMetaInfo()
50     ***  by copying the arguments passed to it,
51     ***  and cleaned up by tr_metaInfoBuilderFree()
52     **/
53 
54     tr_tracker_info* trackers;
55     int trackerCount;
56     char* comment;
57     char* outputFile;
58     bool isPrivate;
59 
60     /**
61     ***  These are set inside tr_makeMetaInfo() so the client
62     ***  can poll periodically to see what the status is.
63     ***  The client can also set abortFlag to nonzero to
64     ***  tell tr_makeMetaInfo() to abort and clean up after itself.
65     **/
66 
67     uint32_t pieceIndex;
68     bool abortFlag;
69     bool isDone;
70     tr_metainfo_builder_err result;
71 
72     /* file in use when result was set to _IO_READ or _IO_WRITE,
73      * or the URL in use when the result was set to _URL */
74     char errfile[2048];
75 
76     /* errno encountered when result was set to _IO_READ or _IO_WRITE */
77     int my_errno;
78 
79     /**
80     ***  This is an implementation detail.
81     ***  The client should never use these fields.
82     **/
83 
84     struct tr_metainfo_builder* nextBuilder;
85 }
86 tr_metainfo_builder;
87 
88 tr_metainfo_builder* tr_metaInfoBuilderCreate(char const* topFile);
89 
90 /**
91  * Call this before tr_makeMetaInfo() to override the builder.pieceSize
92  * and builder.pieceCount values that were set by tr_metainfoBuilderCreate()
93  *
94  * @return false if the piece size isn't valid; eg, isn't a power of two.
95  */
96 bool tr_metaInfoBuilderSetPieceSize(tr_metainfo_builder* builder, uint32_t bytes);
97 
98 void tr_metaInfoBuilderFree(tr_metainfo_builder*);
99 
100 /**
101  * @brief create a new .torrent file
102  *
103  * This is actually done in a worker thread, not the main thread!
104  * Otherwise the client's interface would lock up while this runs.
105  *
106  * It is the caller's responsibility to poll builder->isDone
107  * from time to time!  When the worker thread sets that flag,
108  * the caller must pass the builder to tr_metaInfoBuilderFree().
109  *
110  * @param outputFile if NULL, builder->top + ".torrent" will be used.
111 
112  * @param trackers An array of trackers, sorted by tier from first to last.
113  *                 NOTE: only the `tier' and `announce' fields are used.
114  *
115  * @param trackerCount size of the `trackers' array
116  */
117 void tr_makeMetaInfo(tr_metainfo_builder* builder, char const* outputFile, tr_tracker_info const* trackers, int trackerCount,
118     char const* comment, bool isPrivate);
119 
120 #ifdef __cplusplus
121 }
122 #endif
123