transmission/libtransmission
Charles Kerr 9516e8a923 fixup! refactor: tr_completion (#2220)
fix: incorrect calculation in amountDone
2021-11-28 22:11:30 -06:00
..
.clang-tidy build: enable more .clang-tidy checks (#2088) 2021-11-03 08:59:39 -05:00
CMakeLists.txt refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
ConvertUTF.c refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
ConvertUTF.h Ensure include guard is the first non-comment line 2017-11-14 23:21:28 +03:00
README.md Suggested modernization steps for each *.CC module (#1801) 2021-10-07 12:18:44 -05:00
announcer-common.h refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
announcer-http.cc fix: sonarcloud (#2227) 2021-11-25 16:39:19 -06:00
announcer-udp.cc refactor: increase use of tr sha1 digest t (#2091) 2021-11-03 19:55:04 -05:00
announcer.cc fix: sonarcloud (#2227) 2021-11-25 16:39:19 -06:00
announcer.h perf: intern the announcer module's URL strings (#2085) 2021-11-02 18:00:01 -05:00
bandwidth.cc fix: unused variable warning when building in release mode 2021-11-28 08:05:44 -06:00
bandwidth.h refactor: make Bandwidth.children a std::vector (#2197) 2021-11-20 10:58:47 -06:00
bitfield.cc test: improve tr_bitfield and tr_block_info coverage (#2226) 2021-11-25 14:30:13 -06:00
bitfield.h refactor: tr_completion (#2220) 2021-11-25 12:26:51 -06:00
block-info.cc test: improve tr_bitfield and tr_block_info coverage (#2226) 2021-11-25 14:30:13 -06:00
block-info.h refactor: minor naming change in block_info (#2233) 2021-11-26 13:33:56 -06:00
blocklist.cc refactor: fix uninit var warnings in blocklist.cc (#2087) 2021-11-02 22:55:43 -05:00
blocklist.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
cache.cc refactor: tr_completion (#2220) 2021-11-25 12:26:51 -06:00
cache.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
clients.cc refactor: swarm (#2103) 2021-11-19 12:37:38 -06:00
clients.h fixup! refactor: add tr_peer_id_t (#2004) (#2016) 2021-10-22 15:24:30 -05:00
completion.cc fixup! refactor: tr_completion (#2220) 2021-11-28 22:11:30 -06:00
completion.h refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
crypto-utils-ccrypto.cc refactor: swarm (#2103) 2021-11-19 12:37:38 -06:00
crypto-utils-cyassl.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
crypto-utils-fallback.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
crypto-utils-openssl.cc refactor: swarm (#2103) 2021-11-19 12:37:38 -06:00
crypto-utils-polarssl.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
crypto-utils.cc fixup! refactor: rpc-server.cc (#2152) (#2164) 2021-11-14 21:54:48 -06:00
crypto-utils.h fixup! refactor: rpc-server.cc (#2152) (#2164) 2021-11-14 21:54:48 -06:00
crypto.cc refactor: increase use of tr sha1 digest t (#2091) 2021-11-03 19:55:04 -05:00
crypto.h refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
error-types.h Adjust uncrustify config, reformat all but Mac client 2017-04-20 10:01:22 +03:00
error.cc C++ modernization: Replace NULLs with typesafe nullptrs (#1799) 2021-09-14 19:18:09 -05:00
error.h refactor: use nullptr instead of NULL (#1884) 2021-10-06 11:32:17 -05:00
fdlimit.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
fdlimit.h perf: add tr_buildBuf() (#2068) 2021-10-31 11:38:10 -05:00
file-piece-map.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
file-piece-map.h refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
file-posix.cc refactor: tr_sys_path_dirname(), tr_sys_path_basename() now take std::string_view parameters (#2177) 2021-11-15 18:50:14 -06:00
file-win32.cc refactor: tr_sys_path_dirname(), tr_sys_path_basename() now take std::string_view parameters (#2177) 2021-11-15 18:50:14 -06:00
file.cc refactor: cppcoreguidelines-init-variables pt. 11 (#2012) 2021-10-23 10:43:15 -05:00
file.h refactor: tr_sys_path_dirname(), tr_sys_path_basename() now take std::string_view parameters (#2177) 2021-11-15 18:50:14 -06:00
handshake.cc fix: sonarcloud (#2227) 2021-11-25 16:39:19 -06:00
handshake.h refactor: add tr_peer_id_t (#2004) 2021-10-21 21:40:55 -05:00
history.h refactor: use C++ inheritance for tr_peer, tr_peerMsgs, and tr_webseed (#1877) 2021-10-07 08:33:55 -05:00
inout.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
inout.h Switch to clang-format for code formatting, include Mac client 2021-08-16 00:38:29 +03:00
jsonsl.c chore: update jsonsl parser snapshot (#1050) 2019-11-09 18:06:36 -06:00
jsonsl.h C++ modernization: Replace NULLs with typesafe nullptrs (#1799) 2021-09-14 19:18:09 -05:00
libt.dox (trunk libT) re-start work on making libT doxygen friendly. still a long ways to go on this. 2009-05-29 19:17:12 +00:00
log.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
log.h refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
magnet-metainfo.cc fix: sonarcloud (#2227) 2021-11-25 16:39:19 -06:00
magnet-metainfo.h fix: some sonarcloud warnings (#2189) 2021-11-17 18:17:09 -06:00
makemeta.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
makemeta.h Add support for creating torrents with a source flag (#443) 2021-10-18 18:05:39 -05:00
metainfo.cc refactor: make parts of tr file private (#2241) 2021-11-27 21:17:47 -06:00
metainfo.h refactor: add tr_buildTorrentFilename() (#2196) 2021-11-19 18:36:25 -06:00
mime-types.h refactor: make mime-type array inline constexpr (#1872) 2021-10-01 17:55:19 -05:00
mime-types.js refactor: make mime-type array inline constexpr (#1872) 2021-10-01 17:55:19 -05:00
natpmp.cc refactor: cppcoreguidelines-init-variables pt. 13 (#2043) 2021-10-26 13:02:07 -05:00
natpmp_local.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
net.cc refactor: tr_address_from_string is now std::string_view-friendly (#2176) 2021-11-15 17:03:55 -06:00
net.h refactor: tr_address_from_string is now std::string_view-friendly (#2176) 2021-11-15 17:03:55 -06:00
peer-common.h refactor: swarm (#2103) 2021-11-19 12:37:38 -06:00
peer-io.cc fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
peer-io.h refactor: tr_strv*() util functions (#2123) 2021-11-09 18:13:47 -06:00
peer-mgr-active-requests.cc fix: sonarcloud (#2227) 2021-11-25 16:39:19 -06:00
peer-mgr-active-requests.h refactor: swarm (#2103) 2021-11-19 12:37:38 -06:00
peer-mgr-wishlist.cc fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
peer-mgr-wishlist.h fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
peer-mgr.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
peer-mgr.h refactor: tr_completion (#2220) 2021-11-25 12:26:51 -06:00
peer-msgs.cc fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
peer-msgs.h refactor: make tr_peerIo a class (#1928) 2021-10-11 16:54:16 -05:00
peer-socket.h refactor: remove TR_BEGIN_DECLS, TR_END_DECLS (#1837) 2021-09-25 11:07:22 -05:00
platform-quota.cc Fix building for XFS (#2192) 2021-11-18 11:07:42 -06:00
platform-quota.h refactor: tr_dirSpace() (#2143) 2021-11-13 12:09:14 -06:00
platform.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
platform.h refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
port-forwarding.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
port-forwarding.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
ptrarray.cc refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
ptrarray.h refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
quark.cc feat: add tr_quark_get_string_view() (#2083) 2021-11-01 20:01:27 -05:00
quark.h feat: add tr_quark_get_string_view() (#2083) 2021-11-01 20:01:27 -05:00
resume.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
resume.h refactor: remove TR_BEGIN_DECLS, TR_END_DECLS (#1837) 2021-09-25 11:07:22 -05:00
rpc-server.cc refactor: make tr_variantFromBuf() public (#2187) 2021-11-17 23:37:35 -06:00
rpc-server.h fix: some sonarcloud warnings (#2189) 2021-11-17 18:17:09 -06:00
rpcimpl.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
rpcimpl.h refactor: web_utils (#2121) 2021-11-08 21:30:03 -06:00
session-id.cc feat: add tr_strvPath() (#2134) 2021-11-12 18:10:04 -06:00
session-id.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
session.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
session.h refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
stats.cc refactor: make tr_variantFromBuf() public (#2187) 2021-11-17 23:37:35 -06:00
stats.h refactor: port libtransmission to C++ (#1787) 2021-09-12 12:41:49 -05:00
subprocess-posix.cc fix: env var leak in tr_spawn_async() (#2212) 2021-11-24 13:25:23 -06:00
subprocess-win32.cc fix: env var leak in tr_spawn_async() (#2212) 2021-11-24 13:25:23 -06:00
subprocess.h fix: env var leak in tr_spawn_async() (#2212) 2021-11-24 13:25:23 -06:00
torrent-ctor.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
torrent-magnet.cc refactor: tr_completion (#2220) 2021-11-25 12:26:51 -06:00
torrent-magnet.h fix: 'enumerated and non-enumerated type' warnings (#1810) 2021-09-16 11:22:33 -05:00
torrent.cc refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
torrent.h refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
tr-assert.cc refactor: clang-tidy --fix modernize-deprecated-headers (#1980) 2021-10-17 15:17:18 -05:00
tr-assert.h Modernize bitfield.cc: Storage changes and refactor (#1927) 2021-10-16 09:04:19 -05:00
tr-dht.cc fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
tr-dht.h Ensure include guard is the first non-comment line 2017-11-14 23:21:28 +03:00
tr-getopt.cc refactor: cppcoreguidelines-init-variables pt. 9 (#1997) 2021-10-21 12:40:36 -05:00
tr-getopt.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
tr-lpd.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
tr-lpd.h chore: fix compiler warnings (#1412) 2020-08-27 18:41:26 -05:00
tr-macros.h feat: add tr_strvPath() (#2134) 2021-11-12 18:10:04 -06:00
tr-udp.cc refactor: tr_session.congestion (#2151) 2021-11-14 00:41:44 -06:00
tr-udp.h fix: apply optional peer socket TOS to UDP sockets (#1043) 2021-10-26 20:59:31 -05:00
tr-utp.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
tr-utp.h Ensure include guard is the first non-comment line 2017-11-14 23:21:28 +03:00
transmission.h refactor: add file-piece-map (#2246) 2021-11-28 19:12:54 -06:00
trevent.cc fixup! refactor: use std mutex/lock intead of bespoke (#2194) (#2211) 2021-11-24 10:39:09 -06:00
trevent.h refactor: remove TR_BEGIN_DECLS, TR_END_DECLS (#1837) 2021-09-25 11:07:22 -05:00
upnp.cc refactor: cppcoreguidelines-init-variables pt. 11 (#2012) 2021-10-23 10:43:15 -05:00
upnp.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
utils.cc refactor: use std mutex/lock intead of bespoke (#2194) 2021-11-20 15:20:45 -06:00
utils.h refactor: add a tr_loadFile() variant that takes a reusable buffer (#2181) 2021-11-16 00:15:13 -06:00
variant-benc.cc fix: sonarcloud warnings / code smells (#2242) 2021-11-27 19:58:35 -06:00
variant-common.h refactor: make tr_variantFromBuf() public (#2187) 2021-11-17 23:37:35 -06:00
variant-json.cc fix: coverity warnings (#2229) 2021-11-25 18:14:25 -06:00
variant.cc refactor: make tr_variantFromBuf() public (#2187) 2021-11-17 23:37:35 -06:00
variant.h refactor: make tr_variantFromBuf() public (#2187) 2021-11-17 23:37:35 -06:00
verify.cc refactor: make parts of tr file private (#2241) 2021-11-27 21:17:47 -06:00
verify.h Ensure include guard is the first non-comment line 2017-11-14 23:21:28 +03:00
version.h.in Adjust CFBundleVersion format to fix Sparkle update check 2018-04-17 13:25:49 +03:00
watchdir-common.h refactor: prefer "using" over "typedef" (#1883) 2021-10-06 09:26:07 -05:00
watchdir-generic.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
watchdir-inotify.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
watchdir-kqueue.cc Remove C-style STD headers in watchdir-kqueue.cc (#2037) 2021-10-24 17:30:31 -05:00
watchdir-win32.cc refactor: only use [[maybe_unused]] if arg might be used (#2033) 2021-10-24 11:41:54 -05:00
watchdir.cc refactor: remove tr_variantDictFindStr() from transmission-daemon (#2165) 2021-11-14 22:49:56 -06:00
watchdir.h refactor: remove tr_variantDictFindStr() from transmission-daemon (#2165) 2021-11-14 22:49:56 -06:00
web-utils.cc refactor: magnet metainfo (#2124) 2021-11-09 20:42:18 -06:00
web-utils.h refactor: magnet metainfo (#2124) 2021-11-09 20:42:18 -06:00
web.cc fix: coverity warnings (#2229) 2021-11-25 18:14:25 -06:00
web.h refactor: tr_web's callback now uses std::string_view (#2172) 2021-11-15 12:10:18 -06:00
webseed.cc refactor: make parts of tr file private (#2241) 2021-11-27 21:17:47 -06:00
webseed.h refactor: use C++ inheritance for tr_peer, tr_peerMsgs, and tr_webseed (#1877) 2021-10-07 08:33:55 -05:00
wildmat.c refactor: tr_parseNumberRange returns std::vector. (#1838) 2021-09-25 14:37:28 -05:00

README.md

Notes on the C-to-C++ Conversion

  • libtransmission was written in C for fifteen years, so eliminating all Cisms is nearly impossible. Modernization patches are welcomed but it won't all happen overnight. tr_strdup() and constexpr wil exist side-by-side in the codebase for the forseeable future.

  • It's so tempting to refactor all the things! Please keep modernization patches reasonably focused so that they will be easy to review.

  • Prefer std:: tools over bespoke ones. For example, use std::vector instead of tr_ptrArray. Redundant bespoke code should be removed.

  • Consider ripple effects before adding C++ into public headers. Will it break C code that #includes that header? If you think it might, consult with downstream projects to see if this is a problem for them.

Checklist for modernization of a module

NOTE:
The version in libtransmission/CMakeLists.txt is C++17.
See https://github.com/AnthonyCalandra/modern-cpp-features

This can be done in multiple smaller passes:

  1. Satisfy clang-tidy. libtransmission/.clang-tidy's list of rules should eventually be expanded to a list similar to the one in qt/.clang-tidy.
  2. Group member functions and their parent structs
    • Use namespace libtransmission
    • Split large modules into smaller groups of files in a libtransmission/<name> subdirectories, with own sub-namespace.
  3. Enums replaced with new enum class syntax. Numeric #define constants replaced with C++ const/constexpr.
  4. Memory - promote init and free functions to C++ ctors and dtors, and ensure it is only managed with new/delete
  5. Owned memory - promote simple pointer fields owning their data to smart pointers (unique_ptr, shared_ptr, vector, string)

Detailed Steps

  1. Satisfy clang-tidy warnings

    • Change C includes to C++ wraps, example: <string.h> becomes and update calls to standard library to use std:: namespace prefix. This clearly delineates the border between std library and transmission. Headers must be sorted alphabetically.
    • Headers which are used conditionally based on some #ifdef in the code, should also have same #ifdef in the include section.
    • Revisit type warnings, int vs unsigned int. Sizes and counts should use size_t type where this does not break external API declarations. Ideally change that too.
  2. Move and group code together.

    • Move member functions into structs. To minimize code churn, create function forward declarations inside structs, and give struct_name:: prefixes to the functions.
      typedef struct {
          int field;
      } foo;
      int foo_blep(struct foo *f) {
          return f->field;
      }
      
      becomes:
      struct foo {
          int field;
          void blep(); 
      };
      int foo::blep() {
          return this->field; 
      }
      
    • For functions taking const pointer, add const after the function prototype: int blep() const like so.
    • For structs used by other modules, struct definitions should relocate to internal *-common.h header files.
    • Split large files into sub-modules sharing own separate sub-namespace and sitting in a subdirectory under libtransmission/.
    • Some externally invoked functions must either not move OR have extern "C" adapter functions.
  3. Enums promoted to enum class and given a type:

    enum { A, B, C };
    

    becomes

    enum: int { A, B, C };        // unscoped, use A, B, C
    enum MyEnum: int { A, B, C }; // unscoped, use A, B, C
    // OR wrap into a scope -
    enum struct MyEnum: int { A, B, C }; // scoped, use MyEnum::A
    enum class MyEnum: int { A, B, C };  // scoped, use MyEnum::A
    

    this will make all values of enum to have that numeric type.

  4. Numeric/bool #define constants should be replaced with C++ const/constexpr.

  5. Memory management:

    • Prefer constructors and destructors vs manual construction and destruction. But when doing so must ensure that the struct is never constructed using C malloc/free, but must use C++ new/delete.
    • Avoid using std::memset on a new struct. It is allowed in C, and C++ struct but will destroy virtual table on a C++ class. Use field initializers in C++.
  6. Owned memory:

    • If destructor deletes something, it means it was owned. Promote that field to owning type (vector, unique_ptr, shared_ptr or string).