* perf: faster file tree building in GTK client
* perf: faster GTK client FileList
* use a std::map for faster node lookup when building a file tree
* use tr_get_mime_type_for_filename() for mime-type lookup
* remove unnecessary layer of indirection when building the
keys for lookuops in the mime-type icon cache
* be more careful to only call operator= on proxies whose values
have actually changed, since that assignment is expensive
* refactor: re-enable cert-err33-c clang-tidy warning
* refactor: use fmt::chrono in transmission-remote
* refactor: use fmt::chrono in transmission-show
* refactor: use fmt::chrono in GTK details dialog
* refactor: use fmt::chrono in tr_session
* refactor: remove tr_localtime_r
* refactor: remove tr_gmtime_r
* refactor: use fmt in gtk/SystemIconTray
* refactor: use fmt in gtk/MakeDialog
* refactor: remove unused tr_strip_positional_args()
Co-authored-by: Mike Gelfand <mikedld@mikedld.com>
* refactor: do not use va_arg in peer-msgs.cc
* refactor: do not use va_arg in platform.cc
* build: enable cert-dcl50-cpp clang-tidy warning
* refactor: use some tr_pathbuf where sensible
* refactor: make this variable const
* refactor: replace redundant type with auto
* refactor: use the nullptr literal
* refactor: replace declaration by structured binding declaration
* refactor: implement FileTreeItem::children_ with a std::vector
* fix: std::move should not be called on forwarding reference
* fix: uninitialized scalar variable
* fix: unchecked return value from library
* fix: dereference before null check
* fix: unchecked return value from library
* fix: unchecked return value from library
* fixup! refactor: implement FileTreeItem::children_ with a std::vector
* fix: signed-unsigned comparison in libtransmission tests
* fix: avoid unnecessary copy by using const reference
* fix: function should be declared const
* refactor: use fmt::format to build log timestamps
* fix: use init-statement to reduce variable scope
* fixup! refactor: use fmt::format to build log timestamps
* fix: remove tau_tracker destructor for rule-of-zero
* fix: remove tr_peerIo destructor for rule-of-zero
* Revert "fix: dereference before null check"
This reverts commit cd78967815.
* fix: signed-unsigned comparison in libtransmission tests
* fix: use init-statement to reduce variable scope
* fix: extract nested code block into separate method
* fix: extract nested code block into separate method
* fix: extract nested code block into separate method
* fix: use init-statement to reduce variable scope
* fix: extract nested code block into separate method
* fix: signed-unsigned comparison in libtransmission tests
* fixup! fix: extract nested code block into separate method
* fix: mark possibly-unused as [[maybe_unused]]
* fix: invalid stack memory reference in tr_found_file_t
* fix: signed-unsigned comparison in libtransmission tests
* fix: add default case to switch statement
* fix: remove redundant static specifier
* fix: use std::optional.value_or
* fix: make type of variable pointer-to-const
* refactor: move log state into a struct
* refactor: make tr_peerMgr constructor explicit
* fix: make type of variable pointer-to-const
* fix: replace insert with try_emplace
* fix: implicit conversion may lose precision
* fix: use init-statement to reduce variable scope
* chore: mark unused return value with (void)
* feat: add tr_strbuf class for building tmp strings
Based on fmt::basic_memory_buf, this is a growable string buffer that
has an initial size that's large enough to build most filenames or URLs
without needing heap allocations.
Adds a couple of extra helpers such as a `c_str()` method to make dealing
with old zero-terminated string APIs easier.
* fix: break will never be executed
* refactor: compile the name fallback string
* fix: replace redundant type with auto
* fix: use init-statement to reduce variable scope
* fix: implicit conversion loses precision
* fix: use in-class initializer
* fix: make variable a pointer-to-const
* fix: local variable name shadows class variable
* fix: implicit conversion may lose precision
Add a getter/setter for torrent announce URLs as text that can be copied
and pasted: one URL per line, with a blank line between tiers.
C API: tr_torrentGetTrackerList() and tr_torrentSetTrackerList()
RPC APi: `trackerList` in `torrent-get` and `torrent-set`.
This deprecates `trackerAdd`, `trackerRemove`, and `trackerEdit`
from the RPC API.
* fix: make variable a pointer-to-const
* fix: use init-statement to reduce variable scope
* fix: implicit conversion from long to int
* fix: refactor to not nest more than 3 if|for|do|while|switch statements
* fix: make tr_session::setSocketTos() const
* fix: use array.prototype.some instead of a for loop
* refactor: use nullptr instead of NULL
* fix: oops
* refactor: add fetch options object to tr_webRun()
Fold `tr_webRun()`, `tr_webRunWithCookies()`, and `tr_webRunWebseed()`
into a single API that takes an options argument that callers can
customize to their needs.
Also does a surface cleanup pass to the tr_webseed and tr_web internal
structures, e.g. making fields const where possible, not using raw
pointers, and making some fields private.
This revision is still full of code smells. Refactoring the entire
system is overwhelming, so instead I'm doing it in incremental steps.
Fixes#154. The current 'corrupt' label can confuse users to think that
there is corrupt data on the disk. The phrasing has been changed:
- Downloaded: 1.91 GB
- Corrupt DL: 22.02 MB
+ Downloaded: 1.91 GB (+22.02 MB discarded after failed checksum)
* refactor: prefer constexpr over enum for GUI_PAD values
* refactor: prefer constexpr over enum for PrefsDialog values
* refactor: prefer constexpr over enum for StatsDialog values
* refactor: use enum class for GtrUnicode types
* refactor: prefer constexpr over enum for BT peer msg codes
* refactor: use enum class for TrMakemetaResult
* refactor: prefer constexpr over enum for BT metadata message types
* refactor: use enum class for AwaitingBt
* refactor: use enum class for EncryptionPreference
* refactor: use enum class for TrFormat in rpcimpl
* refactor: prefer constexpr over enum for QApp intervals
* refactor: prefer constexpr over enum for tr_resume bitfields
* refactor: prefer constexpr over enum for Qt/TrFileModel bitfields
* refactor: remove obsolete TODO comment in announce-list
This tag can be used by app stores such as kde discover, gnome software, elementary appcenter, flathub or similar to discern age-appropriate content.
It uses the Open Age Ratings Service (OARS) in order to provide the required information.
* refactor: include <memory> when using shared_ptr or unique_ptr
* refactor: include <cstdio> iff we use it
* refactor: include <cstring> iff we use it
* refactor: include <cstdlib> iff we use it
* refactor: include <string_view> or <string> iff we use it
* refactor: include <array> iff we use it
* refactor: include <ctime> iff we use it
* refactor: include <cctype> iff we use it
* refactor: misc #include cleanups in libtransmission
* (C++) Macros should not be used to define constants
* (C++) Memory should not be managed manually
* (C++) "void*" should not be used in typedefs, member variables, function parameters or return type
* (C++) When the "Rule-of-Zero" is not applicable, the "Rule-of-Five" should be followed
* (C++) "switch" statements should have "default" clauses
* (C++) "explicit" should be used on single-parameter constructors and conversiosn operators
* (C++) Non-const global variables should not be used
Unlike files, which come as a URI list, links dragged from browsers have
textual selection types:
- Firefox: text/plain;charset=utf-8
- Chrome: UTF8_STRING
If the URI list for files is empty, try to pass the selection text to
add_from_url().
For non-C locales, empty string is translated into a multi-line text
containing descriptive translation headers, which then affects cell size
(and in turn, combo widget size) even though that cell is considered a
separator.
There is a fallback mechanism in GTK: when looking for an icon named
foo-a-b-c, it'll also try to find foo-a-b, foo-a, and foo, so the only
icon necessary (if all of them default to the same one) is foo. Given
that we're also installing this icon, including it in resources doesn't
make a lot of sense, by I'm leaving it just in case anyway (useful when
debugging without installing).
* refactor: s/tr_torrentFiles/tr_torrentFileProgress
Replace tr_torrentFiles() with a new function, tr_torrentFileProgress().
tr_torrentFiles() heap-allocated an array of progress structs. There is
nothing intrinsic in tr_torrent making batch computation more efficient,
so this PR replaces it with tr_torrentFileProgress(), a per-file variant
that doesn't use the heap.
* Add support for creating torrents with a source flag
* Add the source flag functionality for Mac OSX
* Source flag should be a part of the info dictionary
* Address review comments
* Rename "sourceFlag" to "source" since "Flag" is usually reserved for booleans.
* Free the "source" pointer in tr_metainfoFree.
* Add information about transmission-create argument to its manpage.
* Replace all occurences of "sourceFlag" with "source" and use "Source tag" in UI
* Settle on just "Source" in UI
* The last usage of "flag" hopefully bites the dust! ;-)
* Add a missing free for the source in tr_metainfoFree
* Add a "source" field to the torrent-get RPC method
* uncrustify
* Test for torrents having different infohashes due to different source flags.
This is the whole point of this feature, so it makes sense to test it.
* case is important
* try to incorporate the macosx xml changes
* refactor: add an enumeration of the script types
This simplifies the API by having a single set of functions that can be
used for getting/setting all the script types.
* Rename GTK client .c files to .cc
* Fix GTK client build errors after C to C++ switch
* Remove `G_{BEGIN,END}_DECLS`
Co-authored-by: Charles Kerr <charles@charleskerr.com>
The "id" member's only purpose is to serve as the key for the
active_notifications hash table. However, the same thing can be very easily
achieved by switching the GHashTable's hash/equal functions to "direct", which
just use the void pointers (which all keys are in a GHashTable) directly as if
they were values, and use GUINT_TO_POINTER() when referring to this hash table's
key.
Co-authored-by: Mike Gelfand <mikedld@users.noreply.github.com>
* refactor: const correctness
* refactor: fix some implicit conversions
* refactor: make local pointers const if their objects are not modified
* refactor: do not cast away const in torrent-cell-renderer
* refactor: remove call to deprecated gtk_icon_size_lookup_for_settings
* refactor: member functions that do not mutate their objects should be declared const
* chore: do not end comments with a semicolon
* refactor: const correctness
* refactor: use getpwuid_r instead of getpwuid
* chore: simplify dict walking loop logic
* refactor: remove dead store assignment in announcer
* refactor: use std::make_shared
* Support .git files (e.g. for worktrees, submodules)
* Fix symlinks in source tarball, switch to TXZ, adjust non-release name
* Remove autotools stuff
Since there is no way to mark parameters as [potentially] unused in
standard C and when using MSVC compiler, use the widely accepted
cast-to-void approach instead.
* chore: disable deprecation warnings in GTK client
Yes, updating the GTK codebase is still a goal. (help welcomed!)
But there's a deluge of deprecation warnings that drown out other more
important warnings, so turn off deprecation warnings for now.
* fixup! chore: disable deprecation warnings in GTK client
* fix: gtk_tree_sortable_set_sort_column_id caller.
* fix: gtk_window_resize caller.
* chore: fix deprecation warnings of GTK_STOCK_ use.
This is just a tiny step towards getting all of the GTK code up-to-date,
but GTK_STOCK warnings are the lowest-hanging fruit of the warnings, so
let's fix them.
* fix: __attribute__(__printf__) warnings
* fix: implicit fallthrough warning
* fixup! fix: implicit fallthrough warning
* fix: disable warnings for 3rd party code
Since we want to leave upstream code as-is
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: disable warnings for 3rd party code
* silence spurious alignment warning
Xrefs
Discussion: https://stackoverflow.com/a/35554349
Macro inspiration: 90ac46f710/f/src/util/util_safealign.h (_35)
* fixup! fix: disable warnings for 3rd party code
* fixup! fix: implicit fallthrough warning
* make uncrustify happy
* remove uncrustify-test.sh
that's probably off-topic for this PR
* fixup! fix: __attribute__(__printf__) warnings
* Update libtransmission/CMakeLists.txt
Co-Authored-By: ckerr <ckerr@github.com>
* fixup! silence spurious alignment warning
* use -w for DISABLE_WARNINGS in Clang
* refactor: fix libtransmission deprecation warnings
* fix: pthread_create's start_routine's return value
This was defined as `void` on non-Windows but should have been `void*`
* chore: uncrustify
* fix: add DISABLE_WARNINGS option for SunPro Studio
* fix "unused in lambda capture" warnings by clang++
* fix 'increases required alignment' warning
Caused from storing int16_t's in a char array.
* fix net.c 'increases required alignment' warning
The code passes in a `struct sockaddr_storage*` which is a padded struct
large enough for the necessary alignment. Unfortunately it was recast as
a `struct sockaddr*` which has less padding and a smaller alignment. The
warning occrred because of these differing alignments.
* make building quieter so warnings are more visible
* fixup! fix 'increases required alignment' warning
* Fix -Wcast-function-type warnings in GTK+ app code
https://gitlab.gnome.org/GNOME/gnome-terminal/issues/96 talks about both
the issue and its solution.
GCC 8's -Wcast-function-type, enabled by -Wextra, is problematic in glib
applications because it's idiomatic there to recast function signatures,
e.g. `g_slist_free(list, (GFunc)g_free, NULL);`.
Disabling the warning with pragmas causes "unrecognized pragma" warnings
on clang and older versions of gcc, and disabling the warning could miss
actual bugs. GCC defines `void (*)(void)` as a special case that matches
anything so we can silence warnings by double-casting through GCallback.
In the previous example, the warning is silenced by changing the code to
read `g_slist_free(list, (GFunc)(GCallback)g_free, NULL);`).
* fixup! fix "unused in lambda capture" warnings by clang++
* fixup! fix "unused in lambda capture" warnings by clang++
* fix two more libtransmission compiler warnings
* fix: in watchdir, use TR_ENABLE_ASSERTS not NDEBUG
* MISRA C++:2008, 8-0-1 - An init-declarator-list or a member-declarator-list
shall consist of a single init-declarator or member-declarator respectively
* CERT, DCL52-J. - Do not declare more than one variable per declaration
* CERT, DCL04-C. - Do not declare more than one variable per declaration
Assignments explicitly enclosed in parentheses are ignored.
* MISRA C:2004, 13.1 - Assignment operators shall not be used in expressions
that yield a Boolean value
* MISRA C++:2008, 6-2-1 - Assignment operators shall not be used in
sub-expressions
* MISRA C:2012, 13.4 - The result of an assignment operator should not be used
* MITRE, CWE-481 - Assigning instead of Comparing
* CERT, EXP45-C. - Do not perform assignments in selection statements
* CERT, EXP51-J. - Do not perform assignments in conditional expressions
* MISRA C++:2008, 2-13-4 - Literal suffixes shall be upper case
* MISRA C:2012, 7.3 - The lowercase character "l" shall not be used in a
literal suffix
* CERT DCL16-C. - Use "L," not "l," to indicate a long value
* CERT, DCL50-J. - Use visually distinct identifiers
The -symbolic icon variant (if available) is used in the GNOME top bar,
and when the high contrast theme is in use. This icon was created by
Jakub Steiner, and comes from the gnome-icons repository:
https://github.com/gnome-design-team/gnome-icons/blob/master/apps-symbolic/Adwaita/scalable/apps/transmission-symbolic.svghttps://bugzilla.redhat.com/show_bug.cgi?id=1221292
There is some confusion over whether symbolic app icons should be
installed to icons/hicolor/scalable/apps (alongside the regular scalable
icon) or to icons/hicolor/symbolic/apps. On the one hand,
https://wiki.gnome.org/Initiatives/GnomeGoals/HighContrastAppIcons has
this to say:
> […] obtain a suitable symbolic style icon […] and install it to the
> hicolor prefix, the same way you would for the full color variant.
>
> cp myapp-symbolic.svg /usr/share/icons/hicolor/scalable/apps/myapp-symbolic.svg
On the other hand, the Fedora package at
https://src.fedoraproject.org/rpms/transmission/blob/master/f/transmission.spec
ships this icon in icons/hicolor/symbolic/apps:
> # Install the symbolic icon
> mkdir -p %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps
> cp %{SOURCE1} %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps/transmission-symbolic.svg
Anecdotally, icons in scalable/ have minimum size 64×64 on openSUSE, so
symbolic/ is the safer location (given the GNOME top bar uses 32×32
icons). This has the advantage of matching the location used in the
distribution which already ships this file.
https://github.com/transmission/transmission/issues/414
This file was originally written by Richard Hughes, for Fedora, who
proposed it on the Transmission forum here:
https://forum.transmissionbt.com/viewtopic.php?f=3&t=16443
It's used to display a nice description and screenshot in GNOME
Software. The format is documented here:
https://www.freedesktop.org/software/appstream/docs/chap-Quickstart.html
The <_name/> and <_summary/> fields match the Name= and Comment= fields
in the .desktop file so are already translated.
The screenshot is taken with Transmission 2.92 (14714) on Fedora 25.
It's at one of the sizes recommended by the GNOME Shell Screenshot
Window Sizer extension.
The <update_contact/> is based on the Git history.
This way all the qualifiers (`const`, `volatile`, `mutable`) are grouped
together, e.g. `T const* const x` vs. `const T* const x`. Also helps reading
types right-to-left, e.g. "constant pointer to constant T" vs. "constant
pointer to T which is constant".
There're places where manual intervention is still required as uncrustify
is not ideal (unfortunately), but at least one may rely on it to do the
right thing most of the time (e.g. when sending in a patch).
The style itself is quite different from what we had before but making it
uniform across all the codebase is the key. I also hope that it'll make the
code more readable (YMMV) and less sensitive to further changes.