# v 0.80   2002.01.22  [beta2]

- Fixed I/O memory leaks.
- Fixed filter memory leaks.
- Fixed ping/pong counting memory leaks (in obsolete code anyway).
- At end of download, also remove "Retry in 10s" entries bearing same name.
- Now makes accurate use of the HTTP "Connection:" header.
- Don't try to open local "config" directory as a file.
- Improved the download selection logic on pushes.
- Be sure to reinstall the SIGPIPE signal handler within the handler
- Fixed bug in header parsing when NUL is the first char on the line.
- Stop filling our Query Hit packets when we reach our own max size limit.

# v 0.80   2002.01.19  [beta]

Summary of changes (user-visible):

- Download queue made persistent: your pending downloads will be saved and
  resumed the next time gtk-gnutella is started.
- The download queue will now show the Host information.
- Pushes now work correctly, and gtk-gnutella can also serve push requests to
  others, so people behind firewalls may now share as well.
- Search results filtering has been implemented: until now, there was only
  the GUI part without any real work done.
- Sorting by host now works on search results.
- Supports the 0.6 handshaking protocol, both for incoming and outgoing
  connections.  Still accepts 0.4 incoming requests, or issues 0.4 outgoing if
  the remote node does not appear to support 0.6.
- Ping/pong traffic is now limited to a few hundred bytes per second on each
  connection, lowering the bandwidth usage: you should be able to open more
  connections than before for the same bandwidth used.

Detailed changes:

- gtk-gnutella.spec now generated at configure time. [From: Sam Varshavchik]
- LimeWire shut down their router.limewire.com pong cache.
- Trace IP of HTTP requests/replies we send or receive.
- Check for valid index/name combination before checking for upload slots.
- Automatically and silently ignore 0-byte files in search results.
- Silentlently ignore files located in private IPs if we don't send pushes
  (this is a temporary hack until someone adds a radio button to achieve this).
- Detect changes in indices for files we already found, and update the
  download queue accordingly (patch from Vladimir Klebanov).
- Improved hex dumping routine and use it to dump data on connection problems.
- Don't send user/password to proxy if none was configured
- Assume we're firewalled and advertise so until we get an incoming connection
- Try to parse all extended Query Hit Data (the open part) assuming BS compat.
- Started to reorganize GUI/callbacks in search.c, moving relevant code to
  callbacks.c and gui.c.  There is still a fair amount of mixing between the
  GUI stuff and the program logic, requiring further fine tuning.
- Rewrote NUL detection logic in search query, and now dumps yet unhandled
  extra query data.
- Constant refactoring: moved download/upload/socket constants and state
  inspection predicates into their respective headers.
- Now scan uploads for timeouts, and added configuration of the various
  time limits via two new config variables: "upload_connected_timeout" and
  "upload_connecting_timeout".
- Proxy connection errors were not reported (show_error() was not implemented).
- Now parses HTTP headers correctly.
- Handles HTTP "HEAD" requests correctly.
- Handles Gnet handshaking at the 0.6 level.  All handshakes are now made at
  the 0.6 level, and upon failure, retried at 0.4.  As for incoming
  connections, both 0.4 and 0.6 are supported.
- Cancelled uploads are now logged with details, since they don't appear
  in the GUI currently.
- Mark upload/download as stalled if no I/O within the last minute
- The amount of seconds between two automatic re-queries of the network
  now has to be at least of 300 seconds.
- Fixed memory leak in uploads (found by Nate).
- Connection statistics now show two figures, as "x/y": x is the amount of
  connected sockets, and y is the amount of attempts made in the background
  but not yet fully connected at the application level.
- Node connections statistics are dumped for debugging.
- Downloads now use the new HTTP header parsing code.
- Don't hammer host caches, allow a reasonable delay between two consecutive
  connection attemps to the same host.
- Now uses fresh pongs when the saved caught host list has been re-read.
- Send 10 fresh pongs to old 0.4 servents to whom we deny the connection.
- Sent Pushes now use the Gnet connection socket, so they will work when
  behind a masquerading+forwarding firewall with only the Gnet port opened.
- Fixed a couple of buglets introduced by the late re-organization of code.
- Added handling of push requests sent by remote servents, i.e gtk-gnutella
  will now reply when others request us to push a file to them.
- If search results say remote servent is firewalled, start immediately in
  push mode when downloading, provided pushes are authorized.
- Recognizes more vendor codes in QHD (Query Hit Descriptor).
- Implemented LimeWire's ping/pong reducing scheme.
- Created doc/gnutella directory, populated with reference on the recently
  implemented algorithms.
- Fixed index-updating bug for downloads in push mode: the mapping was
  not updated correctly, resulting in a failed assertion later on.
- Advertise "Pong-Caching: 0.1" in the 0.6 handshake reply.
- Factorized creation of version string, in a "version_string" global
  that is now used everywhere the name of the program and its version needs
  to be output in a header (User-Agent and Server headers).
- Forgot that search reissue timeout of 0 meant "no reissue".  Fixed, and
  adapted the label text in front of the entry textarea.  Also enlarged
  the area a bit.  [From: Nate]
- Fixed IP/port setups for socks4 and socks5 proxies: now use network order
  instead of native. [From: Robert Bihlmeyer]
- Was not validating config variable `min_dup_ratio'.  Adapted its comment,
  and made other cosmetic change to the config file output.
- Now initializes version string once and for all, at main() time.
  This string is then consistently used in all emitted headers.
- Parses remote "Pong-Caching:" hanshaking header.
- During download requests, force push immediately if the remote end's IP:port
  appears to be not connectible, even if the "Push" bit is not set in QHD.
- Created new "Stopped" state, which is used on retry-able error conditions,
  such as EOF or "Connection reset by peer" errors.  The retry timer was
  shortened from 60 to 15 seconds, awaiting to make it configurable.
- Detect and print as such a failed outgoing connection that sent us
  connection pongs nonetheless.
- Fixed improper trailer generation in query hits: the last flag byte was
  not copied at all.
- Suppressed md5 from the source, it's no longer used.
- Refactoring in routing logic, mainly for push packet handling.
- Push packets are now routed correctly, and no longer widely broadcasted.
- Pushed downloads will abort when the route to the remote servent is lost.
- Forgot to detect TTL=0 pings in our new ping/pong handling logic.
- In case the handshaking fails with a remote strange server, read more data
  to be able to trace more of their reply.
- Now parses the Query Hit packets only once, no matter how many searches open.
- Integrated filtering patch [From Robert Bihlmeyer].  You may now apply
  filters to your searches.
- Double-clicking on a file in the search window will request downloading
  of the selected files. [From Noel T.Nunkovich]
- Removed useless and memory hog host catcher list in the gnutellaNet screen:
  saves 2 MB of RAM plus avoids cost of updating it [From Mark Schreiber].
- Be tolerant on servents that do not send a Content-Length but send
  a proper Content-Range line instead (which we tolerantly parse as well).
- Accept searches even though we might not be connected to the net yet
  [From Mark Schreiber].
- Added Host indication in the download screen [From Mark Schreiber].
- Fixed buglet in has_same_active_download() where "waiting" downloads
  were not considered when looking for duplicates, which could lead to
  assertion failures for pushes later on.
- When not sharing, don't return query hits [From Mark Schreiber].
- When not sharing, send them a "410 Sharing currently disabled" error.
- Added X-Live-Since: to all our HTTP replies.
- Added download queue persistence.
- Download resuming now checks for proper file via an overlap of 512 bytes.
- Split hostcache into two distinct lists: the reserve, and the list of
  nodes we tried and are known to be valid Gnutella servers.  In an attempt
  to limit the tendency of the hostcache to remove hosts rapidly.
- Will now automatically determine that the forced local IP is obsolete
  and change it on the fly, provided we're connecting to modern servents,
  which make use of the Remote-IP header during handshaking.
- Compute IP address of public hostcaches once, to avoid many long DNS lookups.
- When low on hosts in cache, collect "semi-pongs" from Query Hits
  (an idea from Mike Green).  The "low" threshold is 12.5% of maximum.
- Added URL escaping routines.
- Now supports URL-escaped requests, but still sends un-escaped requests to
  remote servents.
- Advertise our node address/port using the Node: header on all outgoing
  handshakes.
- Minor reformatting of config file comments, and raising of default max
  messages to be more tolerent on replies, whilst reducing greatly the max
  size of queries to limit potential of abuse.

# v 0.18   2001.11.19

- Further improved auto-download to not request things we already got
- Refuse to record a download if we still have an identical active one
- Integrated search results limiting patch, from Brian St. Pierre
- Fixed incremental sort logic, which was not accurate for big values
- Made search results sortable by Host and by Info
- Integrated new manpage from Brian St. Pierre (in debian directory)
- Never overwrite files in "completed dir"; rename target file if needed
- Missed "return" statements in error path for "download resuming" checks
- Made auto-download.txt case sensitive, and leading '#' is treated as comment
- Auto-download flag made persistent, and file name set via config file
- Integrated auto-download.txt patch from Brian St. Pierre
- Integrated patch from Brian St. Pierre to burst gnutella.h into small files

# v 0.17   2001.10.24

- Integrated routing table optimization patch from Mark Schreiber
- Shortened default connecting timeouts, especially to other nodes
- Index shared files in an array for faster retrieval
- Enforce strict NUL termination of Query packets we process
- Integrated search table bin categorization patch from Kenn Brooks Hamm

# v 0.16   2001.10.03

- Further optimized library lookups to avoid useless matching operations
- Added two host caches: public.bearshare.net and gnotella.fileflash.com
- Was mistakenly using signed integer in GET requests for file indices
- Double check requested file names with those in our library for extra safety
- When download completes, remove all queued entries for same filename
- Results differing only by connection speed are now considered identical
- The payload size of query hits was written in native format, instead of LE!
- Optimized query hit packet construction, reducing mem fragmentation
- Now shows itself as "Gtk-Gnut" instead of "Gtk-Gnutella"
- Fixed important sharing bug where extensions were not matched for correctly
- Can now configure a max size for the host cache (defaults to 20480)
- Kicking policies for dup messages and high TTL now configurable
- Removed unneeded inclusion of <mcheck.h>
- Fixed broken "rm" in debian/rules, changed it to "rm -f"
- Show "<unparsed>" when results have an unparsed query hit trailer
- Ran all sources through "indent -kr", plus minimal reformating, ts=4 now

# v 0.15   2001.09.20

- No longer depends on having "glade" or "tcl" for building
- Try to simultaneously connect to as many hosts as permitted by min settings
- Can now stop and resume passive searches as well.
- Only resort to host catchers when host catch is empty
- Now uses 4 host catchers: router.limewire.com, connect[1..3].gnutellanet.com
- Fixed improper GUI dependency between min/max node connection settings
- Identify as a "modern" client in the GUID, handling protocol 0.4.
- Allocate node reception buffer once, not each time a >4K message is received.
- Avoid dropping replies on high TTL, adjust the field down
- Send back pongs and query hits using the hop count of request as TTL
  (since replies must be routed along the same path, it need not be greater)
- Kick out nodes sending us messages with TTL=0.
- Initial host catcher is now router.limewire.com.
- Ignore file count and sizes in pongs when high bits are set (obviously wrong!)

# v 0.14   2001.09.12

- New project admin Raphael Manfredi <Raphael_Manfredi@pobox.com>
- Integrated all pending (to date) patches on sourceforge.
- Fixed all memory leaks found by dmalloc.
- Fixed segmentation faults.
- Use more efficient pattern scanning to grep through the library file names
- Searches in local library now use begining-of-word matchings
- Configuration now saved in ~/.gtk-gnutella/config
- Many new configuration variables, none settable through GUI yet
- More efficient handling of host catching list to avoid long startup times
- Can limit uploads per IP address (from config file only)
- Better error reporting during read/write errors
- Show more information about connected nodes (TX/RX/Drop/Bad)
- Installed node kicking policies
- Avoid hammering hosts from which we download via smarter scheduling
- Handle upload and download resuming
- Uses much less CPU under stable operation, but can still be improved.
- Lots of other minor fixes and many hours of testing

# v 0.13   2001.05.25

- Searches now show client, busy and MP3 tag info
- Columns now saved correctly
- Downloads do not hammer host, wait 20 seconds+, same IP handled
- Downloads behave better and I found the segfault bug!
- Search select all feature added (config option)
- Search strict AND filter feature added (config option)
- Debug assist code added, prints hex, dbg variable added
- Some readme doc updates
- Client identifies itself properly as Gtk-Gnutella 'GTKG' to the net
- 503 and other returns handled better, queue is better
- Lots of other fixes and many hours testing

 stuff from Goswin:

- parse for any 2xx http header
- recognise 5xx busy headers
- check for non resuming clients
- don't download the same filename twice
- dequeue one download once a second in the main loop
- download_pickup_queued disabled
- move file from completed dir to partial dir when a bigger one with
  the same name is downloaded (both dirs should be on the same drive,
  otherwise the copying will take so long on big files that most
  connections will timeout).
- requeue on timeout
- don't remember that you gone into push mode, try a direct connect
  each time.
- accept long urls on uploads such as a proxy would send


# v 0.13	  2001.01.05

- File Sharing (woohoo!)
- force_local_ip fixed (more than one fix)
- Max simultaneous uploads
- gui_update_upload moved into main timer
- Autoconnect to gnutellahosts.com on startup
- Automatically connect to new hosts when below "atleast connections" 
- Configure option to discard non-routable ip's
- Solaris (maybe win23?) build fix
- Allow passive search results
- Ignore duplicate search results
- "never send push request" option
- "Jump to Downloads" switch added
- "Clear Results" button added to search screen
- Auto-repeat searches on new control connections
- All sorts of other random fixes
 
* v 0.13          2000.07.??

- 32 bits overflow when computing the size of all files on the GnutellaNet
  (in the gnutellanet stats) should been fixed
- Currently implementing the multiple simultaneous searches and the search
  results filters
- The widths of the different clists's columns are now remembered
- You can now force your local IP to whatever you want [NEED TESTS PLEASE]
- 'Current port' label is now updated
- Automatic retry for failed downloads
- A new option limits the number of downloads from a single GnutellaNet host
- Users with big default fonts should now see all the menus
- A quit button has been added
- gtk-gnutella is now linked against libresolv if needed for inet_aton()

* v 0.12          2000.05.03

- All C++ style comments have been replaced by C style comments
- Incoming connections are now accepted again (lame bug created in 0.11 fixed)
- Slashes are replaced by backslashes in downloaded files names
- Downloaded files are no more created before we actually receive data for them
- Queued downloads can now be reordered by drag and drop
- Queued downloads can now be started at any time (using right mouse button on
  them)
- Active downloads can now be forced to push mode, moved back to the queue,
  or killed (with the output file removed) using right mouse button on them
- Preferences and configuration are now saved in a directory instead of a
  single file. You can choose the path of the directory to be used by setting
  the GTA_GNUTELLA_DIR environment variable before running gtk-gnutella.
  By default it will be ~/.gtk-gnutella/ 
- Estimated TR (Time Remaining) is displayed while downloading files
- Catched hosts are now saved in clear text in a separate file:
  GTA_GNUTELLA_DIR/hosts
- Catched hosts can be imported from and exported to any text file (using
  right mouse button on the gnutella host catcher)
- Gtk-Gnutella should now compile (using gcc) and run on more processors
- A few memory leaks removed, but some remain (I don't know where yet)
- Serious bug that made Gtk-Gnutella send garbage when the sendqueue for slow
  nodes excedeed 1024 bytes has been fixed
- Completed download files are now moved to a different directory, that can be
  choosen in the config screen
- Gtk-Gnutella now remembers the position and the size of the window
- Automatic sorting of search results can be stopped by right clicking in the
  search results list (GTK doesn't seem to handle well auto sorting)


* v 0.11          2000.04.19

- Sizes of files in the gnutellanet stats, in search results and in downloads
  lists are now displayed in B, KB, MB or GB. By the way, the gnutellanet
  stats will display the right number of shared bytes...
- Search results can now be sorted by File name, Size, or Speed.
- Buttons 'abort selected', 'resume selected' and 'clear completed' in the
  download section should be less randomly active / unactive.
- The numbers of active and completed downloads should be more accurate.
- The number of routing errors should be more accurate too.
- Some warnings about malformed packets have been removed (that happens too
  often to be displayed...)
- Do not allow more than one incoming connection from the same IP, to prevent
  connect flood attacks (Somebody tried to establish more than 32 simultaneous
  connections (from the same IP) to my client today...)
- Catched hosts are now saved, and reloaded next time Gtk-Gnutella is started.


* v 0.1           2000.04.16

- First release of Gtk-Gnutella :)

