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