== API changes ==

Add macro for asserting with internal_error exception.

A disk setting manager, allow change of read-ahead etc. Each download
should also include slots for monitoring syncing, etc.

The seed count and scrape leech/seed.

Rename FileListIterator.

Allow the client to set the priority of chunks directly, just add some
helper functions.

Remove the old non-const rate functions in Download.

Allow flags to be passed during creation of download. This would be
used to f.ex deciding if a download should be considered a multi-file
torrent or not.


=== torrent::Object ==

Ways of checking that they are a value and between a range.

Make an union of two bencode streams. This will allow rtorrent to save
much smaller files with recent changes, and thus not require
re-constructing torrent files of ~100KB in some cases.

Add a variable that has can have an off state, plus a value range.

Add a bit for modified entries, or perhaps just freeze lists/maps.

Need to make this cheap for copying, so that we don't need to rely on
an inherently borked design in the use of Variable::m_cache. It
doesn't work if we call the same variable several times.


=== Session management ==

Saving session torrents should be lazy, perhaps only for those who are
not open. Or do session torrent saving as needed, when seeding is
stopped etc. Perhaps a dirty flag.


== Configurable keybindings ==

...


== Efficiently handle torrents in watched directories ==

Currently a load is triggered every time for a bad torrent/duplicate
torrent. Fix this.

Consider tieing new files that match old torrents without a
tied_to_file.

== Delegator rework ==

Keep multiple downloads of the same block seperate. When done, and
hash checking fails, compare pieces and merge/mark equal pieces. Those
would have higher priority when comparing, but not absolute.

The anonymous mmap'ed regions would contain different dtor functor
than file chunks.

We need to keep around PeerInfo's after peers disconnect, so we store
information for longer that the immediate connection. This also eases
the delegator since we can use pointers to identify the peer we
downloaded the piece from.

Get rid of affinity, perhaps each peer saves the pointer to the
delegator chunk they are currently using, in addition to the delegator
piece.


Re-enable randomized selector position.

Do the range-disable and position moving in d selector.


== Sockets ==

Look into increasing the socket buffers. This would allow us to queue
more data for each poll event. But make sure we only get polled when
the buffer can take a nice amount of data.

The goal would be to push as much data into the buffer per event as
possible if it is uploading fast.


== Improve logging ==

...


== Disk worker thread ==

A worker thread that gets activated to do stuff like hashing and
syncing to disk. This would have the benefit of avoiding SIGBUS due to
full disk as msync can be called blockingly.

Before work can start on this, a threading library needs to be
available. Possibly the TR2 stuff?


== Tracker scrape ==

Add tracker scraping and display connected/not-connected seeds and
leechers.

In the mean time, parse the extra information the official tracker
transmits on requests.


== typedefs or more restrictive types for chunk indices, ports and such ==

These would include defines for invalid states etc.


== Validate the presence of files for session torrents ==

Make sure that when session torrents are opened, it ensures that the
downloaded/ing files are where we last saw them. Libtorrent shouldn't
create the files when opened, but perhaps a call can be added for
trying to make them?

Also, when starting torrents, bork on incorrect sizes so as to not
overwrite files created by other torrents.


== Added initialization stuff to sections in the elf file? ==

Stuff like adding stuff to the ClientInfo object could be done from
with a resource file embedded in the executable.


== Extensions ==

* Send max block size on connection initialization.
* Don't send the whole bitfield when you're a seeder.
