# since last version

# v 0.90   2002.07.07  [stable]

Highlight of changes (user-visible):

- All configuration can now be made from the GUI.
- Fully redesigned search filters to work like ipchains/iptable on Linux.
- Obsoleted experimental "auto-download", superseded by the new filtering code.
- Added Gnutella bandwidth management.
- Both HTTP and Gnet bandwidth is now displayed real time.
- Added full HUGE support (Hash/URN Gnutella Extensions).
- Added support for local host preference.
- Gtk-gnutella can do traffic compression when connecting to a node that
  also supports it.
- Upload and downloads will now show User-Agent/Server information.
- Added status to the download queue.
- You can now freeze the download queue whilst manipulating it.
- Searches can now be listed on the left side of the screen, or as tabs like
  in the previous versions.
- Added automatic banning of servents that are hammering us.
- Many more cool new features that you'll discover whilst playing with it.

- (2002.07.07 - RAM)
  * Raised limit for requeries from 300 to 600 seconds.
  * Updated manual page.

- (2002.07.06 - RAM)
  * In case there are unfreed atoms at exit time, dump their values.
  * Don't forbid connections to local host on different port.
  * Allocate only minimal amount of memory when simply validating query hits.
  * When notifying for new versions, distinguish between releases and
	development, and show their timestamps.
  * Protected more warnings to show only in debugging mode.
  * Default TX flow-control timeout of 300 was too much: reduced to 60.

- (2002.07.05 - RAM)
  * Random cleanup: sanity checks in query hits and pongs, RX timeouts.
  * host_init() was spuriously declaring pcache_init() in its body.
  * Don't enter SHA1 filtering rules for records with no SHA1 [From Richard].
  * Added regular alive pings.
  * Preserve status message when moving stopped downloads to the queue.
  * Will now send "connection" pongs during the first 5 minutes of startup,
    even if it thinks it's firewalled, in the hope we'll get an incoming
    connection.

- (2002.07.02 - Richard)
  * Added "Apply" and "Revert" buttons to filter dialog
  * Made the "filter enabled" state work with shadows
  * Added "Add/Replace" and "Abort" buttons to rule editors
  * Removed double meaning of "Ok" button in filter dialog and replaced
    that with the "Add/Replace" button in the rule editors
  * Filter rule count, rule list and enabled/disabled states should
    properly show after a apply/revert
  * Try to preserve expansion state of nodes in the filter tree.
  * Removed the notion of a "session" from the filter code. Now 
    filters_current, filters_added and filters_removed are always expected
    to have valid content.
  * Gave search_xml access to the filters_current list to properly load
    the saved filters.
  * Added missing "if (filter_dialog == NULL) return" to some callbacks.
  * Try to reduce list updates in filter window to a minimum.
  * Fixed some debug messages where refcount was shown wrong.
  * Increased debug level on rule matching.
  * Pressing [enter] in search results list will download the selected items.

- (2002.07.02 - RAM)
  * Will no longer be tricked into saying it's not firewalled because a local
    connection to the node is attempted. (fixes bug #562127).
  * Added pseudo-extension "--all--" which allows to share all files, whether
    they have an extension or not [Debian patch from Zygo Blaxell].
  * Don't enter ourselves in the pong/host cache.
  * Typo minumum -> minimum in GUI.
  * When overriding upload slots, use recent bandwidth for computation, not
    the average, or we'll override more often when the limit is raised.
  * When "Nothing more to get" on downloads. remove all identical files from
    the queue as well.
  * Avoid needless display flickering in search screens [From Richard].
  * During shutdown, make sure we neither accept nor make Gnet connections.
  * Ignore XML size in QHD for Swapper.
  * Remove freeze/thaw calls to node clists during update.

# v 0.90   2002.07.01  [beta2]

Highlight of changes (user-visible):

- Bug fixes and slight improvements.
- Greatly enhanced auto-selection in searches to use far less CPU.
- Will now warn user when encountering a newer version of gtk-gnutella.
- URN searches now supported, by typing "urn:sha1:" in search text, followed
  by the base32 value.

- (2002.07.01 - RAM)
  * Added configure check for mandatory zlib.
  * Was wrongly stopping at GGEP magic byte when grabbing XML extension.
  * Optimized GUI update of node information, traversing list once only.
  * When closing a search, remove pending messages from all the search queues.

- (2002.06.30 - RAM)
  * Tuned auto-selection in search window to be an O(n) algorithm instead
    of O(n*n), which greatly improves performance [From Richard].
  * Protected a few pong-cache warnings, so that they be emitted only
    when running in debugging mode.
  * When removing completed downloads from queue, also remove first-order
    aliases by SHA1, if available.
  * Fixed upload crash when we can't send back the whole HTTP status
    [From Paul Cassella].

- (2002.06.29 - RAM)
  * More Solaris fixes [Uros Bizjak, patch #575037].
  * Added hardwired list of servent GUIDs to ban for push routes.
  * Now banning GUID "20d262ff0e6fd6119734004005a207b1" for push routing.
    (this GUID seems to be bundled as a constant in Morpheus)
  * Rationalize right-click menu handling in all panes [From Richard].
  * Fixed crashes with the filter popup window when search was closed
    before the filter popup [From Richard].

- (2002.06.28 - RAM)
  * Portability fix in socks v5 code [From Bruce Momjian, patch #574919].
  * Portability fixes for FreeBSD [From Aron, patch #574111].
  * Can now enter an urn:sha1: search directly (will beep if invalid).
  * Simplified URL parsing, and accept leading http:// case-insensitively.
  * Raised BYE grace period to 30 seconds to be compatible with shutdown grace.
  * Don't flag as new a version bearing the same timestamp as ours.
  * Don't throw away node from hostcache if we can't connect due to lack
    of file descriptor.

- (2002.06.27 - RAM)
  * Stop all processing for 0.4 handshaking after Tue Jul  1 00:00:00 2003.
  * Added configure check for glib >= 1.2.10 [From Richard].
  * Make sure GUI configuration for download overlap does not exceed the
    size of the socket's buffer [From Richard].
  * Added version checking: gtk-gnutella will now warn when it sees a newer
    version than itself.
  * Fixed base32 decoding to use gint8 instead of gchar to be sure to
    get signed characters.
  * Removed heartbeat warnings about skewed clock when not debugging.
  * Fixed dynamic upload slots spinbutton sensitivity (fixes bug #574592)
    [From Richard].
  * Changed getdate to parse dates as DD/MM/YYYY, not as MM/DD/YYYY.
  * Fixed Gnutella size reading in message headers: alignment constraints
    would cause a bus error on some CPUs.
  * Added configure check for strcasestr(), which is present on some systems.
  * Better seed the random number generator.

- (2002.06.25 - RAM)
  * Did not include proper gui.c version in 0.90 beta.
  * Do not abort when regular expression in queue matching is invalid!
  * Avoid using all file descriptors for banning.  Now configurable via two
    new config variables, namely ban_max_fds and ban_ratio_fds.
  * Fixed bug in dmesh_url_parse(), caused by buggy sscanf(), grrr...

# v 0.90   2002.06.24  [beta]

History of changes since 0.85 stable:

- (2002.06.24 - RAM)
  * Debian package now requires glib1.2 >= 1.2.10.
  * Added warning in dmesh_alternate_location() in case we overflow buffer.
    Also check returned val from g_snprintf() to account for trailing NUL.
  * Integrated Richard's filter cleanup patch.
  * Added nicer servent name for two new servents: RAZA and SWFT.
  * Mark callout queue event as freed to avoid memory corruptions in case
    of misuse (i.e. usage bug).
  * Forgot that dm_expire() could empty the mesh entry (fixes bug #573027).
  * Fixed buggy node_remove_non_nearby() (closes bug #572918).
  * Added vendor information to warning about improper pong-caching.

- (2002.06.23 - Richard)
  * Added RETURN back to filter tree on request
  * Enabled stats for RETURN
  * Free rule clipboard before exiting to prevent dmalloc from suspecting
    a memory leak.
  * Update credits
  * Made vertical scrollbars at some points always visible to reduce 
    flickering

- (2002.06.23 - RAM)
  * Forgot that scheduling in callout queue uses milli-seconds units: was
    purging uploading mesh info too often.  Also added mesh info traces.
  * Added periodic savings of the search/filters.
  * Saving of search.xml is done to a .new file, renamed upon success,
    to prevent one loosing precious data in case of a crash whilst saving.
  * Forgot to clear callout queue callback info before freeing structure
    (fixes bug # 572800).
  * Fixed root cause of GTK critical warnings regarding progress bar.
  * Forgot to include Alex Bennee in AUTHORS.
  * Make sure we detect a duplicate node connection before dropping a node
    in favour of a local one (fixes bug # 572748).

- (2002.06.23 - Richard)
  * Also set foreground color for root nodes and builtin targets in 
    filter dialog
  * Removed "search again" items from download/queue popups
  * Correctly unselect when doing a "connect to host" on download/queue popup
  * Don't display RETURN target in filter tree. Stats don't work properly
    and it's actually a metatarget which is not intersting to see.
  * Removed coloring of builtin targets in filter dialog because I can't set
    the foreground of the leave node.

- (2002.06.23 - RAM)
  * Fixed size computation problems when generating alternate location header.
  * Now displays Server name in downloads as soon as it is known.  Previously,
    it needed to be known beforehand (from a previous try) to be displayed.
  * Obsoleted old "autodownload" feature, since we now have more flexible
    download selection features with the filter chains.
  * Mesh information will now only be sent to uploaders when a change occurred.
  * Christophe Tronche was missing from AUTHORS.

- (2002.06.23 - Richard)
  * Fixed bug: active downloads not unfreezed after "force push"
  * Mark active "push mode" downloads and "always push" downloads in queue
  * Tagret combos are correctly updated when adding and removing a filter
  * "About" box added.
  * Added builtin targets to filter tree to have the stats (not selectable)
  * Added stats to builtin targets
  * Remember node state in filter tree
  * BEEP if user tries to create filter with invalid name (empty or filter
    with same name does already exist) It's not a problem to have two
    searches for exactly the same though.
  * added filter_find_by_name_in_session routine to filter.c (used to 
    determine wether a filter name is valid, i.e. does not exist)

- (2002.06.22 - RAM)
  * Fixed memory leak in search queues.
  * Fixed possible use of uninitialized value in analyse_status().
  * Added debugging traces in huge.c cache flushing... Which made the
    problem I witnessed go away.
  * Unplugged non-functional QRP stuff.

- (2002.06.22 - Richard)
  * Added STATE rule which uses the DOWNLOAD and DISPLAY filter result
    properties for the condition.
  * Added RETURN target to filter dialog. It aborts the processing of the
    current chain returning to the caller.
  * Make filter root-nodes in filter dialog not selectable
  * Builtin filter targets have uppercase names.
  * Removed cruft: search_strict_and
  * Synced GUI limits with config reader limits. (Closes #557681)
  * Removed "autodownload" checkbox from GUI and deleted it's callback
    This is to be replaced by the filtering system.
  * More cleanup of the config.c file
  * Rule count in filter tree is correctly updated when a rule is
    inserted/removed.
  * #527208 is closed since autoselection does respect hashes since
    a few days.
  * Hopefully now really fixed: access rule members after freeing the rule in
    filter_replace_rule_in_session
  * Added filter_gui_update_rule_count call to filter_gui
  * Rename old searches file when moving to XML mode instead of delting.
    Also move this from search_init to search_shutdown.
  * Item count above results list is correctly updated when the
    search is cleared.

- (2002.06.22 - RAM)
  * Bandwidth limit is now up to BS_BW_MAX, included.
  * Now attempts to free memory as soon as a search record is removed from
    the GUI, and not when the search is closed.
  * Would be omitting to send a SHA1 starting with a leading NUL byte.
  * Forgot to clear the node's search queue at final cleanup.

- (2002.06.21 - Richard)
  * BUG: access rule members after freeing the rule in 
    filter_replace_rule_in_session
  * Added popup to rules list in filter dialog (copy/paste rule)
  * Made filter_free_rule public

- (2002.06.21 - RAM)
  * Forgot to free dmesh slots sometimes.
  * General cleanup to be able to compile with dmalloc.
  * Watch out the g_snprintf() return code: it can return more than the
    buffer size with glibc >= 2.1.

- (2002.06.20 - RAM)
  * Was not properly parsing more than one GGEP extension block in a row.
  * First take at download mesh implementation, with code refactoring.
  * Lowered max banning period to 3 hours, instead of 1 whole day.
  * Removed the gnotella.fileflash.com host cache: host no longer exists.
  * New date_to_iso_gchar() to emit the ISO date for the download mesh.
  * Now keeps track of the time we received the query hits, for the
    download mesh.
  * Simplified parsing of the query hit trailer, keeping only the vendor
    code around instead of the whole trailer.  Adapted sorting algorithm
    accordingly.
  * shared_file_by_sha1_base32() is no longer used (share.c).
  * New url_escape_into() routine (url.c).
  * HTTP status parsing routine now called http_status_parse().

- (2002.06.20 - Richard)
  * Bug: segfault during autoselection (NULL rowdata) (Thanks Daniel)
  * Filtering now supports multiple properties to set (display/download)
  * Added "Auto-download by [name|hash]" to search popup
  * Changed valid values for the filter_default_policy config value from
    0,1 to 1,2 (mapped on load for backward compatibility)
  * Changes in filtering code make all filter stats count double
    (one count for every property).
  * merges search_gui_update into search_matched (search.c)
  * split search_gui_add_record out of search_gui_update

- (2002.06.17 - Richard)
  * Bugfix to "Autoselect identical" is handled
  * Column visibility is persistant in search panel

- (2002.06.16 - Richard)
  * Added ability to filter by urn:sha1 and by flags (push, stable, busy)
    (urn:sha1 filter is not editable yet)
  * Added "Don't show results with urn:sha1" to search popup
  * Added "Edit filter" back to search popup
  * Changed header of urn column in search results to "urn:sha1" and
    centered it
  * Added "Abort all with urn:sha1" to downloads and queue popup.
  * Made the download_remove_all* return the number of removed downloads
  * Display the number of removed downloads in the status bar
  * Freeze queue and downloads list when acting on a "Abort all..."
  * When a new rule or filter is added, display "new" instead of
    "none yet" in the stats column to show that this filter will
    not be used unless the user closes the filter dialog with "Ok".
  * Started to use scid_info for general temporary information in 
    the status bar.
  * Make autoselection also select files with the same hash as the
    selected in addition to those with the same name
  * Added "Globally drop results with [name|urn:sha1]" to search popup.
    I wanted to be able to drop definite spam once and for all.
  * Netmask for ip filter rules defaults to 255.255.255.255
  * Column visibility in search pane now affects all searches
    (internally the visibility state is propagated from the old to
    the new clist on a switch)
  * Added "Autoselect identical" checkbutton to search pane.

- (2002.06.15 - Richard)
  * Added URN column to the search results (hidden by default)
  * Made gui and backend use same code for comparing records
    (search_compare). 
  * Made passive searches persistant

- (2002.06.15 - RAM)
  * Propagate SHA1 from query hits to download requests.
  * Now recognizes old base32 encoding, translated into new one.
  * Had not properly plugged in the 301 Moved triggering for uploads.
  * Until we have received a message from nodes, handle them with the
    "connecting" timeout.  This works because of the handshaking ping.
  * Reworked upload HTTP parsing so that we can handle HEAD requests on
    /uri-res/N2R? queries as well.
  * Download code will now honour 301 Moved replies from other nodes.
  * Added debugging traces for queries/hits holding more than 32 extensions.

- (2002.06.13 - RAM)
  * Added rigorous extension parsing.
  * Fixed hash table init for GUID/SHA1 atoms.
  * Make sure we use POSIX extended regular expressions.
  * Added strcasestr() routine to misc.c.
  * Now extracts SHA1 out of query hits for each record.
  * Now validates SHA1 representation in queries, dropping bad queries.
  * Fixed handling of GET /uri-res/N2R: the "urn:sha1:" part is a
    case-insensitive string.  Likewise when extracting SHA1 from HTTP headers.

- (2002.06.11 - Richard)
  * Fixed bug: default filter not set on passive searches.
  * Fixed bug: rule editor not properly cleared when work_filter
    gets removed because it's bound search got removed
  * Fixed bug: filter dialog size not remembered correctly
  * More clean up of the filter api
  * More moving gtk code to from filter.c to filter_gui.c
  * Adding/removing of filters is also shadowed now (meaning you can
    cancel it in the dialog)
  * Added calls to bypass shadowing for adding and removing rules.
  * Added "Don't show selected" to search popup. This adds a drop rule to
    the search filter for all files which match exactly the filenames from
    the selected records. It does not jet check for duplicates.

- (2002.06.08 - Richard)
  * Remove optionmenu widget for selecting filters from filter dialog
    and added a tree instead.
  * Filters can now be deactivated
  * Added some buttons to reset filter/rule stats
  * Started to split up callbacks.c/h and filter.c/h and created
    filter.c (controller), filter_cb.c (callbacks) filtler_gui.c
    (gui calls). This is a first attempt to seperate backend from
    frontend calls so we don't fix something up now and tear it
    apart later. Better try to do it right from the start.
  * Fixed bug: bw_ul_usage_enabled was not properly persistant
  * Added general macros to set/clear flags to misc.h
  * Added a flag_t type for storing flags binary (use with above macros)
  * Filter stats update periodically

- (2002.06.07 - RAM)
  * Added atoms, allowing sharing of common constants.
  * Made callbacks.c use new gui_allow_rescan_dir().
  * Raised default TTL to 7 (was 5) and default max TTL to 10 (was 7) to
    match what appears to be a common setting in other servents.
  * Plugged in atom strings for downloads.c, huge.c, main.c, search.c,
    share.c and uploads.c.
  * Moved Gnutella query message definitions from search.h to gnutella.h.
  * When non-local nodes are removed to favor local ones, send BYE 202 messages.
  * Second stab at QRP: Computes routing table patches incrementally.
  * Now requests URNs in all our queries.
  * Reworked library scanning to use atoms, and in particular store the full
    file path as an atom (shared with huge.c in the SHA1 cache).
  * Added support for transparent index remapping for older servents sending
    a request with an incorrect index.
  * Made common warnings in sockets.c silent unless debugging enabled.
  * Fixed improper dump of incoming data on first long lines.
  * Send a 301 Moved with proper Location redirection when requesting a file
    with an improper index and an X-Gnutella-Content-URN is given and does
    not match the request, but another file we have.
  * Added incremental deflating routines for QRP patch compression.

- (2002.06.03 - RAM)
  * Fixed improper semantics of the "contains words" filter.  ALL the
    words must be present for a match to occur.

- (2002.06.02 - Richard) 
  * Format of RULE_SIZE display string changed.
  * Added "Create filter" button to dialog.
  * Normalize upper/lower value in filter_new_size_rule()
  * Replaced all g_message calls with printf (fixes log corruption)
  * Filter rules can now be deactivated
  * When a filter has the "don't display" target, the user may choose
    to grey out the result instead of completely dropping it using the
    "mark only" flag.
  * Make filter dialog size persistant.
  * The xml backend gives better information when unable to read in the
    xml file and can cope with missing rule flags.
  * Information about how often a rule matched is displayed in the
    filter dialog (but not updated periodically)
  * Fixed default filter selection when adding a new search.
    
- (2002.06.02 - RAM)
  * Added build dependency on libxml2-dev in debian control.
  * Force --enable-xml-store in debian's build.
  * Will now prevent propagation of badly formed/too short queries.
  * Replaced more gtk_idle_add() calls with g_idle_add().

- (2002.06.01 - Richard)
  * Disabled xml backend by default. Use "configure --enable-xml-store"
    to enable it. You need libxml2 and libxml2-dev packages installed 
    for it to work.
  * Fixed bug: assertion failure when trying to edit filters without
    any search existing.
  * It's no longer possible to edit the builtin filters (was a bug
    that this was possible).
  * Added widgets to configure the minimal upload b/w percentage patch 
    [From Tobias Frech] to the bandwidth config panel.
  * Changes build scripts to remove dependency on gnome-config and 
    added checks for libxml2.

- (2002.05.30 - Richard)
  * New filter code and dialog.
  * Moved from callback.c on_search_switch as gui_view_search to gui.c 
  * Changed searches list from GSList to GList.  
  * Use search_t instead of struct search.  
  * Began to move search related gtk code to gui.c (gui_search_close) 
  * Optionally use xml backend or simple text file for makeing searches
    persistent.  
  * Use "search_close" instead of manually closing searches in
     search_shutdown().
  * Changed handling of "minium speed" widget. You can change the minimum 
    speed on a existant search and change the default minimum speed on the 
    gnutellaNet config pane.
  * Moved the gui part of removing a search from search.c to gui.c 
  * Removed macro definitions of the notebook page numbers
    and switched to enums.  
  * Moved main_window and shutdown_window to gui.c and have them as externs 
    in gui.h 
  * Added gui_show_search(search).
  * Added some functions to handle option menus more easily (gtk-missing)

- (2002.05.29 - RAM)
  * Added date parsing.
  * Now parses Retry-After in HTTP replies, supersedes user-defined timeouts.
  * When banning, emmit a Retry-After header.
  * Renamed getdate() to date2time() to avoid conflict on Solaris.
  * Integrated minimal upload b/w percentage patch [From Tobias Frech].

- (2002.05.27 - RAM)
  * Fixed ipf_unban() to test rounded integer counter and not float in removal.
  * Was not properly updating SHA1 info when library was being rebuilt.
  * Was not properly sending back urn:sha1 in query hits (truncating the
    ':' separator).
  * All SHA1 digests are now stored in binary internally.
  * Added padding chars to base32 encoding, and "const" in the signatures.

- (2002.05.24 - RAM)
  * First stab at QRP.  Computes the routing table, but it is not used yet.
  * Added QRP message definition.
  * Callout queue is now a global service and is initialized from main.
  * Scan library after GUI is brought up.
  * Was not accounting Gnet header traffic as Gnet bandwidth.
  * Added anti-hammering feature, that will ban users sending more
    than 10 requests per minute (sliding window).
  * Always honour HEAD requests, even when busy, provided no hammering.

- (2002.05.24 - Richard)
  * allow shrinking of main window to smaller then minimum size required
    by the child widgets
  * Added a optional search list to the sidebar. Displays: search name,
    hits, new hits (number and color), paused searches (color)
  * Made tree menu resizable in both directions.
  * Added "copy url" item to queue popup
  * Added "connect to host" item to queue and downloads popup
  * Added "configure columns" item to search results popup.
    Note: the visibility state of the colums is not persistent, this
    is only a proof of concept for the selection widget yet.
  * Carry information about which tab is associated with which menu item
    from the tree menu directly in the user_data of the node instead
    of in a static array.
  * Freeze clists during all actions which take place on the the selection.
  * Replaced g_assert(0) with g_assert_not_reached() where found.
  * Made "unselect" signal callback for downloads and queue call the
    "select" signal. Same actions needed.
  * Instead of unrealizing and removing the arrow widget, just destroy
    it. 
  * If the tab in notebook_main is switched, the tree menu reflects the
    change.
  * Fixed bug which caused both, "firewalled" and "not firewalled" icons
    to be displayed when hiding and then showing the statusbar again.
  * Increased default sidebar size to 128 pixels. (closes #558890)
  * Almost finished cleaning up config.c. The config file looks much
    cleaner again.
  * Use gtk_events_pending() instead of g_main_pending() in gtk_main_flush().
  * Add hack to set the internal column name in a clist. Currently this is
    needed for the GtkColumnChooser widget to work properly.
  * Moved menu initialization from main.c to gui.c. This means most of
    the gtk stuff is now removed from main.c
  * Added more enums to gui.h to describe important gui values (like
    giving names to notebook pages)
  * Moved the updateing of the traffic stats from gui_update_global() to
    gui_update_traffic_stats and only call it in the main timer. No need
    to call it more often (gui_update_global is called from some callbacks
    and stuff).
  * Made notebook tabs in search results tab not hide if there is no search.
    This had conflicted with either showing tabs or sidebar list.

- (2002.05.21 - RAM)
  * huge.c: cast all file sizes to long before printf("%ld") since some
    machines have 64-bit off_t (but Gnuetlla only has a 32-bit field for
    propagating file sizes, so it does not matter).
  * Forgot to emit initial header when appending values to disk SHA1 cache.
  * Hacked a quick fix for the duplicate SHA1 work problem.
  * downloads.c and huge.c: Another batch of off_t args cast into gulong.
  * Added UTF-8 decoder for queries, and transformation to ISO-8859-1.
    The query text are now interpreted as ISO-8859-1 by default, unless
    the query "looks like" UTF-8.  In any case: no full Unicode support.
  * Fixed search statistics scheduling mess, and removed spurious main
    initialization since GUI settings already triggered search_stats_enable().

- (2002.05.20 - RAM)
  * When queuing a download from the same GUID/file, check the IP:port in
    case it changed since we queued it, and not solely reject it as a
    duplicate.
  * When the full SHA1 hashing credit is not used, do not perform the
    feedback adjustment, since those assume all the credit was used.
  * In share.c: now uses gtk_main_flush() to update the GUI, not the single
    loop iteration.
  * uploads.c: fixed segfault at shutdown time (dup free of user_agent field).
  * Honour X-Gnutella-Content-URN in requests and send a 404 error if
    the file we have does not match.
  * Will now send back X-Gnutella-Content-URN in the HTTP reply with the SHA1
    (if we have it) on 503 Busy errors.
  * Applied cleanup patch #557071 [From Uros Bizjak].
  * Applied Solaris compile patch #558202 [From Uros Bizjak].
  * Applied structure packing, SOCKS error message fix, and cleanup patch
    [From Michael Core].

- (2002.05.20 - Richard)
  * Switched names of arrow_up.xpm and arrow_down.xpm (closes #558219)
  * Added "User agent" column to uploads
  * Added "Server" column to downloads and queue
  * Display sort order in searches in column header
    (closes #557690)
  * Remove "stop sorting" from search popup. This can now be achived
    by clicking on the column headers.

- (2002.05.19 - RAM)
  * Integrated SHA1 / HUGE patch [From Ch. Tronche].
  * Force creation of config directory if it does not exist
    (fixes bug #557114).
  * Don't run file name searches on small query texts when there is an URN
    match attempted.
  * Keep track of User-Agent and Server in HTTP requests.
  * Further adjustments in huge.c:
    + Use glib timeouts, not gtk ones to not needlessly tie to the GUI.
    + Improved timer adjustment feedback to shoot for 3/2 of the max life.
    + Added debugging SHA1 computation rate traces.

- (2002.05.19 - Richard)
  * Removed "clear queue" button. This is not necessary. To clear the
    whole queue, just use a empty regex to select all and then use
    "abort" from the popup menu. We don't want people to accidentially
    purge thier queue.
  * Made non-editable entries sensitive, so that at thier content is
    copy-pastable.
  * Increased sleep time during shutdown to 200ms again, but process any
    pending Gtk events before sleeping.
  * Made size of sidebar (menu, stats) persistent.
  * Changed tooltip text for the "local netmask" stuff.

- (2002.05.18 - RAM)
  * Improved shutdown code to avoid segfaults in grace period and deny all
    pending Gnet connections cleanly.
  * Moved pong-caching code to pcache.c.
  * Reorganized the way we detect that BYE was sent, and added support for
    probing the size of the TX stack.
  * Pay attention to GUI settings for bandwidth limitation before enabling
    the corresponding schedulers: only do so when they explicitly wish
    to limit traffic (provided allocated bandwidth is >0).

- (2002.05.17 - Richard)
  * Fixed bug: drag in queue while queue is freezed unfreezes queue.
  * Reflect freezeing of queue in the gui (as would explicit freezing).
  * Reduce min value for listen_port to 0 in glade.
  * Display notice window when shutting down.
  * Made menu expand and used gtkpaned so size of sidebar can be changed.
    Size is not yet persistent.
  * Removed stream button from search panel since unused.
  * Tried to fix problem with segfault during shutdown and thus
    disabled timer calls in main timer for things that were
    already closed (uploads/downloads) during grace period.
    Failed miserably because we still have a segfault.

- (2002.05.17 - RAM)
  * Applied enum/macro cleanup patch #555837 [From Uros Bizjak].
  * Display download queue status entries.
  * Fixed guess_local_ip() to never replace a previous non-private IP with
    a private one.
  * Added exit grace period to make sure final BYE messages get a reasonable
    chance of being sent.
  * Added extended copyright notices, per FSF recommendations.
  * Added copy of the GPL in the LICENSE file.

- (2002.05.16 - Richard)
  * The position of the divider in the downloads pane is persisitent.
    Attention: I implemented the missing gtk_paned_get_position function
    and it has the same name as the GTK2 function will have.
  * Started to tidy up config file
  * Hopefully fixed sourceforge bug #555758: Crash when drag lasts too long?
    Catch the drag signals and freeze the queue during drag. This prevents
    items to be removed from the list during the drag which I think was
    the cause for the crash.

- (2002.05.15 - Richard)
  * Fixed bug with spinbuttons: manually entering a value did require
    to hit enter two times or did not work at all. Had to use
    connect_after() to connect the signals.
  * Save width of "Status" column added to queue.
  * Display notice in the statusbar if the address has changed.
  * Added gNet traffic display and reworked the View menu and stats
    display a little
  * Replaced the hosts_in_catcher entry with a progressbar.
  * Changed some limits on the new configuration items.
  * Obsoleted all *bps* config variables and replaced them with
    *bws* counterparts to reflect the internal changing of names
    within bsched. Kept code to load the values from the *bps*
    variables though.
  * Added configuration of gNet bandwidth control

- (2002.05.14 - Richard)
  * Added lots of config stuff.

- (2002.05.14 - RAM)
  * Added traffic compression ratios.
  * Added support for Gnet bandwidth limiting (core only, no GUI settings).
  * Fixed flow-control problems on TX stack.
  * Fixed assertions on search sending to account for initial random hop count.

- (2002.05.12 - Richard)
  * Added "Status" column to queue. Not working properly yet.
  * Added icon to display "firewalled" and "not firewalled"
    status in statusbar
  * Change spinbutton support from using int to using float.
  * Fixed decimal values in the bandwidth settings
  * Unselect all before using regex to select (more intuitive)
  * Updated debian/substvars: added depends on zlib1g

- (2002.05.12 - RAM)
  * Removed debugging warning on Z_BUF_ERROR when TX flushing.
  * Search stats configuration unit is now the second.
  * Fixed assertion failure in deflate_rotate_and_send(): the culprit
    was deflate_nagle_timeout(), calling that routine without checking.
  * Added Debian build dependency on zlib1g-dev (in debian/control).
  * Compressed node traffic indicated by TXc and/or RXc in Info field.
  * Fixed typo in cq.c that caused hash bucket chaining to be mixed up.
  * Fixed order in the CH_INSERT_AFTER macro that was corrupting tail too
    early (forgot it was a macro, and not a function call).
  * Made destruction of the RX stack a true depth-first operation.
  * The RX inflater will stop delivering packets as soon as RX is disabled.
  * The TX deflater writev() routine was not accurately detecting flow-control.
  * Need to dispose of the RX stack asynchronously, not on the interrupt stack.

- (2002.05.11 - Richard)
  * Added a saftey call to disable the tabs of notebook_main even
    if left on in glade.
  * Added "local node" information to the main nodes display.
  * Added boxes around the queue and downloads frames, so the vpaned
    scales better.
  * Changed "Remove all matching regex" to "Select all matching regex".
  * Renamed some config variables and widgets to get better naming
    consistency.
  * Changed "Listen port" and "proxy port" to spinbuttons.
  * Added "Enable autoselect" to search panels. This binds to the
    search_pick_all config variable.
  * Made missing checkbutton states persistent.
  * Added some macro magic to gui.c, config.c and callbacks.c. More readbility,
    less writing effort.
  * Moved updating of gui widgets at startup from config_init() to
    gui_update_all().
  
- (2002.05.11 - RAM)
  * Allowed "configure --enable-no-rfc1918" to default to off (was forced on).
  * Exported bsched_disable().
  * Re-architected RX stack.
  * Added first support for Gnet traffic compression (still some rough edges).

- (2002.05.08 - RAM)
  * Ensured no line is longer than 80 characters in main.c and gui.c.
  * Dynamically setting bandwidth to 0 prevented all traffic instead of
    disabling bandwidth limiting.
  * Even if bandwidth scheduler is disabled, go through the EMA computation
    of the bandwidth actually used, for GUI display purposes.
  * Added Roles section to the AUTHORS file.

- (2002.05.07 - RAM)
  * Now that local_ip is persistent, we need to refresh it regularily in case
    it changes from one invocation to the other, and not always trust its
    persisted settings.
  * Changed "Shutdowning" -> "Closing".

- (2002.05.07 - Richard)
  * Added "Remove all matching regex from queue" to downloads panel
    (case sensitivity is not persistent yet)
  * Fixed memory leak in dialog-filters.c regex handling code
    (g_free(re)).

- (2002.05.04 - Richard)
  * Added "Max uploads to single host" to uploads panel
  * The usual cleanup of spacings and labels and stuff I came across
  * Added preliminary designs of a new filter dialog to the glade
    file. No functionality yet. Will probably be redesigned before
    actually being integrated.
  * Fixed bug: search field does not clear when search is added
  * Fixed bug: search tab headers do not update the result count
    properly when having "remove downloaded items from list" checked.
  * Fixed typo: "QUEUE FROZEN" instead of "QUEUE FREEZED"
  * Note: for autocompletition on a GtkCombo (e.g. search combo), try
    Alt-Tab. Works in any application.
  * moved more code from main.c to gui_init
  * removed clist_connections (old stats) from glade and gui code

- (2002.05.02 - RAM)
  * Fixed bug #551185: was not initializing local_netmasks_string.
  * Fixed bug #552255: could be wrongly freeing static string.

- (2002.05.01 - RAM)
  * Integrated the search queue patch: searches are now sent once every
    10 seconds on a per-connection basis [From Alex Bennee].
  * Was improperly counting duplicates as "bad" messages.
  * Now displays both dup/bad message counts in the Info column for nodes.
  * Searches now made persistent [From Michael Tesch].
  * Got rid of the local-config-file overwriting.  All configuration files
    are now exclusively saved in the config dir, never locally (unless you
    run from that config dir!).
  * Fixed bug #538946: was incorrectly moving complete files out of the
    done directory.  Also, "Nothing more to get" error is now reported if
    one tries to downloads a smaller file (it was not flagged as an error,
    so the "Completed" message was shown instead of the error text).

- (2002.05.01 - Richard)
  * fixed sensitivity of "copy url" in downloads popup
  * make search history work (though not persistent)
  * added "Remove downloaded items from list" checkbox to search panel
    Use this to have items selected for download automatically be 
    removed from the result list.

- (2002.04.30 - Richard)
  * Put statistics into a handlebox so they can be displayed seperatly
    from the main window
  * Went throught the gui layout and set a consistent layout style:
    horizonal spacing: 4; vertical spacing: 2; border: 2
  * removing of unnecessary widgets and more clean up of the widget
    tree
  * make "remove file" in downloads popup work
  * removed "abort and delete file" from downloads popup
  * made "copy url" really supply an escaped url which should work
    when pasted to a browser
  * changed the widget for entering search strings in the search panel
    from a GtkEntry to a GtkCombo as a preparation to supply a search
    history in future.
  * fixed sensitivity of several items in the downloads popup which
    were sensitive even if they would have done nothing when activated.

- (2002.04.27 - RAM)
  * Reversed logic for forced IP, to make it behave properly: the IP is
    now only updated dynamically when "force IP" is not checked.
  * Added download_remove_file() and download_file_exists().
  * Check for new "download_delete_aborted" condition in download_abort() to
    remove file when it is set.
  * Added debug logging of bad packets, to help diagnose why we receive
    bad packets from gtk-gnutella.
  * Made nodes.c compile on the Alpha, where varargs objects are different.
    (fixes bug #537460)

- (2002.04.25 - Richard)
  * moved more code from main.c to gui_init() in gui.c.
  * added checkbutton "Delete file on abort" to downloads panel. When this
    is on, aborting a download will also remove the associated file from the
    hard disk. This is to prevent us from having multiple "Abort..." and
    "Abort and delete..." entries in the popup menu.
    This functionality still has to be integrated into the download logic.
  * remove the "update" button for port configuration on the config network
    panel. This entry now behaves just like every other entry (enter or 
    change focus to accept changes).
  * replaced more entries in the config panels with GtkSpinButtons.
  * added a "copy url" item to the downloads popup. This can be used to 
    copy the url of a single download to the clipboard and paste it
    e.g. to your browser. This is only selectable, if a single download
    is selected.
  * added build_url_from_download() to misc.c because of the above
  * cleaned up lots of stuff in gui.c, including coding style but mostly
    changing the way focus-out signals were handled. Now a focus-out signal
    triggers a activate-callback on all widgets to update the program state. 
    Meaning, we no longer use "grab_focus(menutree)" to trigger a focus-out
    event (useless focus jumping). Instead when pressing "enter" on a widget,
    the change is accepted and the focus stays where it is.
  * more layout in the config panels.
    
- (2002.04.22 - RAM)
  * Always update actual bandwidth used, even when the scheduler is disabled,
    so that the GUI can display the current usage whether bandwidth is
    limited or not.
  * Removed useless SIG_Ignore() signal handling trap, just SIG_IGN them.
  * Ignore SIGXFSZ so that subsequent write() fail: if not ignored, that
    signal will kill the process.
  * Added debugging output for auto-downloads, and refactored list iteration
    bits to be more in line with the other uses.

- (2002.04.21 - Richard)
  * click on bandwidth stats to toggle display mode (normal/average)
  * added "authenticate to proxy" to network config. The associated
    config variable is called proxy_auth.
  * made bandwidth stats more readable

# change of changelog format to better accomodate multiple contributors.

- made reissue timeout spinbutton on search-pane wider. (Richard)
- made config pane a tabbed pane. (Richard)
- added bandwidth control to config pane. (Richard)
- added support for temporary statusbar messages (Richard)
- reorganized configuration pane (made a tabbed pane) (Richard)
- added gui controls for changing bandwidth allocation in the config
  pane. (Richard)
- added indicators for current bandwidth allocation to left panel.
  (Richard)
- now really use statusbar contexts and the GtkStatusbar stack features.
  (Richard)
- Moved freeze toggle-button out of the context menu and display a
  message in the statusbar to warn the user that the queue is freezed.
  (Richard)
- added several new popup menu items to popup-download and popup-queue,
  but disabled them for now since they are not backed up by code yet.
  (Richard)
- removed useless host catcher popup code (Richard)
- added "freeze" toggle button to queue context menu. This can be used to 
  enable/disable the automatic moving of files to and from the queue
  (i.e. disable download_timer). To make this work properly, the
  download timer is the only function now to call download_pickup_queued.
  (Richard)
- added "kill all named" and "kill all from" to popup-queue and popup-downloads.
  These will remove all queued downloads and abort all active downloads
  matching any of the selected items. (Richard)
- visually distinguish items in search list that where already selected for
  downloading (Richard)
- Added uptime of servent to statusbar. (Richard)
- Modified multiple-selection handling in on_button_uploads_kill_clicked,
  on_button_downloads_queue_remove_clicked and on_download_start_now_activate.
  This should fix problems where the selection was not actually acted on.
- made popup_queue_start_now (de)activate correctly when maximum
  number of downloads is reached (Richard)
- Missed out to hide notebook tabs after modifing the gui. 
- Rearranged widgets to reduce minimum window size. On my box this means
  604x503 (sorry 640x480 guys... maybe later). 
  Enabled both scrollbars on nodes list
  Closes #540610 (Richard)
- Changed lots of stuff on the gui layout (Richard)
- Changed menu from list to tree (Richard)
- Renamed lots of widgets (Richard)
- Fixed several popup action handlers to cope with multiple selections 
  (Richard)
- Can add searches from the monitor pane (only if monitoring is off, because
  otherwise the selection would be gone too fast).
  (Richard)
- Replace numeric text fields (like max no of downloads) with a spinbutton
  (Richard)
- Disable autoselection when more that one file is already selected (search).
  (Richard)
- Hidden old stats frame (Richard)
- Added menu bar and statusbar (both optional) (Richard)
- Added progress bars to display connection/upload/download stats (optional)
  (Richard)
- Made build-glade target in Makefile really regererate the code from the
  gtk-gnutella.glade file by calling src/Makefile glade_files
  (Richard)
- Updated Debian's control file.
- Now accounts for bytes transferred in interrupted uploads as well, and in
  particular at servent shutdown time.
- When not sharing, return HTTP error 503 instead of 410, since it is a
  server-side problem, not a client-side problem.
- When facing an HTTP/1.1 request, make sure there is a Host: header.
- Added routines for on-the-fly bandwidth settings, and access macros for
  getting the instantaneous and average bandwidth usage per second.
- Refactoring of network TX layer.
- Display the uptime as either "HH:MM:SS" or "d HH:MM" with blinking ":".
- Optionally favor local Gnet hosts over remote ones, per netmask [Mike Perry].

# v 0.85   2002.04.04  [stable]

- Changed bzero() into memset() in sockets.c for Solaris [patch #538619].
- Hidden useless gnutellaNet stats window.

# v 0.85   2002.03.30  [beta2]

Summary of changes (user-visible):

- Portability fixes.
- Memory leak fixes.
- Was moving to wrong pane when "jump-to-downloads" enabled.

Detailed changes:

- Define SOL_TCP as IPPROTO_TCP for non-linux machines.
- Added a return to shut up compiler warnings in bio_sendfile().
- Fixed memory leaks in queue.
- Shutdown TX side of socket after having sent Bye.
- Fixed memory leak in uploads, in push request handling (bug #534434).
- Was moving to wrong pane when "jump-to-downloads" enabled
  (bug #535000, with fix from Steven Walter).
- Increased receive buffer size for nodes from 48K to 112K.
- Fixed node_sent_ttl0(), which assumed node was kicked-out when Bye is sent,
  although it is no longer the case, unless Bye was already sent.
- Will now report error 414, "Requested URL Too Large", when encountered.
- Could mistakenly report 404, "Not Found" when rebuilding library.

# v 0.85   2002.03.23  [beta1]

Summary of changes (user-visible):

- Now support Gnutella traffic prioritization and flow-control for enhanced
  stability of connections.
- Can now use an HTTP proxy for outgoing connections, in addition to SOCKS
  v4 and v5 proxies.
- When "Force local IP" is ticked, gtk-gnutella will try to automatically
  update the value if it detects a change in your IP address.
- Added search statistics.
- Added persistent upload statistics, keeping track of which files were
  uploaded by users, and how many times.
- Will now show the size of the uploaded file and the requested range,
  under the form "request @ offset" in the Range column.
- Node servent names are now displayed in the gnutellaNet window, if known.
- Bandwidth management for input and output traffic is now possible.  It can
  only be configured via the config file though, not via the GUI.  It only
  accounts upload/download traffic, not Gnet traffic.
- Displayed transfer rates are now instantaneous transfer rates, not average.
- Upon completion, uploads and downloads show the time spent in transfer.

Detailed changes:

- Node send queue is now managed as a real queue.
- Added node transmission flow control.
- Routing decisions and actual routing are now two distinct operations.
- Some download control hardwired constants were made config parameters.
- Fixed downloading policy to avoid retrying ad infinitum when the connection
  cannot be made at the TCP/IP level (because there's nothing listening).
- Added support for the Bye packet.
- Dispatched heartbeat timer routines to the relevant files.
- Integrated HTTP proxy patch [From Szabolcs Self].
- Properly handle Range requests such as "123-456" and "-567".  Still no
  handling for things like "123-456,457-789" though.
- Extract and log vendor information of nodes we connect to.
- Fixed improper counting of TX-dropped packets in flow-control as RX-dropped.
- All % completion figures now shown with 2 decimals.
- Since we can now automatically determine our IP correctly, make sure the
  "force local IP" parameter is true by default.
- Could be sending pongs with TTL=0 by mistake.
- Was always sending pings with TTL=1 by mistake.
- Initial take at bandwidth management -- can only be configured via the
  config file, i.e. once and for all.  Gnet traffic does not count.
- HTTP error code 408 is retryable.
- Include Date and Last-Modified headers in our HTTP success replies.
- Switched to real-time download/upload transfer rate and ETA computations.
- Fixed number of columns in search table to 5.
- Fixed bug in handling node_bye() for ponging-only connections (#518822).
- When current transfer rates are too low, switch to average rate for
  estimating time remaining.
- More cleanup in the routing code, which fixes a potentially harmful bug.
- Ensure original downloads are saved in downloads.orig, and protect against
  sudden death whilst saving.
- Turn on TCP_CORK for uploads, to optimize outgoing bandwidth.
- Makes use of sendfile(2) if available.
- Huge cleanup in routing.c: function renaming, signature changes, assertion
  cleanup and comment additions.  In particular, removed a wrong assertion,
  known as "m->nodes" when failing.
- Trace user interface, OS type, OS version and CPU type in User-Agent.
- In the "Config" page, show total size of files shared.
- Adapted proxy_connect() signature to be able to get it to compile on IRIX.
- Now detects and handles the situation wereby time goes backwards or forwards
  due to time synchronization (NTP deaemon).
- Display the time spent uploading or downloading when entry is completed.
- TCP reception buffer is raised to 112K for downloads.
- The default node queue size is now 96K (150% of 64K, the max message size).
- Added support for higher-priority control messages.
- Node statistics now show amount of messages in queue, and percentage of
  the send queue filled with messages.
- Alive pings are now replied to with a higher priority pong.
- Tuned flow control to avoid too many memory allocation/free, and saturation
  of the queue (lowered high watermark to 50%).
- Now also emits the Remote-IP header when connecting to other nodes.
- Node statistics are now updated once per second on the GUI.
- Added Morpheus (MRPH) to the list of vendor codes.
- Fixed bugs #524773, #524987, #523762, #524988.
- Added Size/Range columns to the upload screen.
- Added Vendor and protocol Ver(sion) columns in the node screen.
- The GUID of a servent is now made persistent and flagged as such, in order
  to prepare the possible implementation of gnet: URLs.
- Factorized generation of random numbers into random_value().
- Added search statistics pane [From Michael Tesch, patch #524921].
- When "Never send a push request" is ticked, don't bother showing results
  from explicitely firewalled servents.
- Disable the "Start now" menu entry if we don't have any more download slot.
- Removed broken support for computation of lower-cased directory paths in
  the shared library.
- Fixed broken recursive scan of the library, with help from Michael Tesch.
- Ensure we do not launch two copies of gtk-gnutella backed by the same
  configuration, and protect any configuration change made whilst the
  program was running by saving a copy of the old configuration if needed.
- Fixed push bug, by allowing several downloads to be recorded for the
  same (index, GUID) tuple.  This can happen if we don't notice a re-indexing
  on the remote host.
- Fobid the multicast IP range, and also the new 169.254/16 private range.
  Downloads at those addresses will be pushed.
- Don't remove queued downloads whose size is greater than the one we completed.
- When downloading a file bigger than the one in the done directory,
  and provided it's on the same filesystem as the tmp directory, move it out
  for resuming.  This is safe now that we perform range overlapping.
- Changed error message "Route lost" into "Push route lost".
- Don't abort with "Push route lost" when we only fell back to push, but the
  address does not seem to be private and there was no push indication in the
  query hit.
- Added upload statistics pane [From Michael Tesch, patch #529294].
- Attempt to flush upload statistics on a regular basis when changed.
- Try to flush queued messages on nodes as fast as possible by turning
  on TCP_NODELAY to disable Nagle's algorithm.
- Reworked on the shutdowning/bye code to maximize chances of proper delivery
  of the BYE indication.
- Must duplicate filenames in uploads in case library is rebuilt, or it will
  corrupt the upload statistics.
- Save config and host cache in a temporary file first, then rename as the
  final file when everything is OK to avoid corrupting precious data via an
  incomplete write.
- Be sure to disable a queue becoming empty in mq_clear() if it was enabled
  (fixes bug #530811).
- Split I/O vectors larger than the max allowed size (fixes bug #530106).
- Fixed off-by-one error in url_escape_cntrl() causing memory corruptions.
- When needed, must disable reading before calling node_bye(), in case we're
  facing a temporary "ponging" connection, which node_bye() happily removes
  (fixes bug #531167).
- Now handle parsing of 0.6 handshake headers on Ponging connections, to grab
  any Node: header and fake a pong.  This also allows Ponging 0.6 hosts to
  be seen in the GUI: they used to be discarded very early in the process,
  making display impossible.
- Was mistakenly displaying last offset as size in uploads.
- Negative range requests are offsets from the end of the file.
- Added upload stats "average count" [From Michael Tesch, patch #533257]
  (will convert existing stats to the new format).
- Ensure minimum value for node_sendqueue_size (1.5 * max packet size).
- Fixed cornercase, a leftover of bug #530811.
- Fixed crash when upload stats are cleared (bug #533904).

# v 0.80   2002.01.31  [stable]
# 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 :)

