Nachtblitz Changelog ==================== Version 1.4.27 (release #34) - March 23, 2016 - Just keeping the project alive. Version 1.4.26 (release #33) - April 2, 2015 - Updated Polish translation (thank you Jaskier). - Prevent a crash that occurred when moving application data files (thank you globus999). - Improved querying sources through connected clients. Version 1.4.25 (release #32) - January 24, 2015 - Added a Polish translation thanks to Jaskier. - Added two columns to search tabs that indicate the first and most recent time a file was found (thank you Fantomas). Increased the upward compatibility of the data format regarding column adjustments. Prevent that all columns become invisible. - Added a main menu item that can be used to show the output directory (where completed downloads go) in the operating system file manager. - Improved the "Open Containing Folder" functionality so that the corresponding file gets automatically selected when the external file manager opens. - If the preview directory is required while it does not exists, don't just warn the user, but prompt if the user wants to have it created (thank you Sparky). - If a translation contains a value that is an empty string, the corresponding text will now be treated as missing and the English text will be used instead. - Allow to use up to three letters as time period symbol in translations (text-keys 60 to 64). Thank you Jaskier. - Improved content management. - Allow the user to move complete files to another directory through the Details tab. - Removed the advanced flag that allowed the user to manually set the io path casing mode (it's now managed automatically). - Proceeded providing an own way of validating and manipulating io paths to work around limitations of the .NET Framework. - If the available space of a volume cannot be determined, assume that it's enough (instead of assuming the opposite as before). - When replying to a keyword search, do not send the source count that was originally sent by the publishing peer, instead send the source count the local client's index has for that file. - Designed and implemented a text-based filter for the Kademlia index as well as the search results (thank you Fantomas). Created the corresponding user interface and the support routines. - Extended the network protocol to make file selection more specific (FileSelectionFlags). - Improved the way querying sources from connected peers works. - Do not allow the SecIdent handshake to take more than five minutes. Also introduced SecIdent version 4. - Improved the way the bandwidth capabilities of the network are determined automatically. - Improved repair mechanism for broken connection (manual connection mode). - Enabled the user to limit the hard drive load caused thorough hashing (thank you Fantomas). - Always create handles for temporary files thread-safe to prevent a potential race condition during shutdown. Reject notifications from the content manager while the user interface shuts down. - Fixed FileIO.PrepareFileBuffer(). - Added a mechanism that suspends the network functionality of the client when the version being used was released more than one year ago, with a message that strongly encourages updating. - Cleaned up the zlibManaged assembly. - The directories for translations, bar backgrounds and preview files now have names that are purely lowercase. - Numerous small improvements. Version 1.4.24 (release #31) - October 14, 2014 - Designed and implemented a sophisticated upload queue. - Added protocol opcodes (TI_...) that allow the seamless transition of a downloading client to the upload queue (without requiring a complete reset as with OP_OUTOFPARTREQS) and that make operations nonambiguous. - Display the upload queue length on the "Stats" tab and restrict the files displayed on the "Uploads" tab to the files currently being uploaded (now leaving away the ones on queue). - Added an own protocol for the extension opcodes specific to this client (and moved preexisting extension opcodes there). - Workaround a defect in version 1.4.14 to 1.4.23 of this client when connecting to prevent the connection from being closed during SecIdent. - Align file ranges more thoroughly when sending file content. - When finding out the number of sources of a file that is subject to a file search, calculate the mean of all source indications instead of sticking to the source count that first comes along (thank you UnknownUser). - Changed the available disk space reading on the stats tab so that it indicates whatever is smaller, the free space of the disk volume with the application data or the free space of the volume with the (download completion) output directory. - Unicode normalize (NFC) file names if they are to be used for external purposes (as for links or for publishing). - Prevent the user from using relative paths to keep path information obvious. - Improved the way restoring from a minimized window state works. One left mouse button click on the notification icon suffices now to show the main window. - Store the time a file was first and most recently encountered when a file search is performed (thank you Fantomas). Not visible in the user interface yet. - Increased the width of group boxes on the general options panel (thank you Fantomas). - Rearranged a number of function key shortcuts. - Prevent an exception in SuggestDownloadBoundsForChunk(). - Various minor improvements and changes. Version 1.4.23 (release #30) - August 25, 2014 - Improved the Wine tutorial (thank you Fantomas for reporting Wine related problems and suggesting solutions). - Added the available disk space of the drive that holds the application data to the stats. If the output directory for downloaded files is on a different drive, that drive is not regarded. - Deactivated OS governed file system watching when running on Wine, to prevent an exception inside the .NET framework. Scans driven by the application level are performed more frequently to compensate. - Reduced the format requirements for file paths, so that more paths that are legal on Unix can be used. File names get marshalled into a platform compatible form now, when they are meant for external purposes such as creating links or publishing files. - When a complete file is about to get renamed through the application's user interface, warn the user about platform incompatibility if the proposed name starts with a DOS device name (which is illegal on Windows). - Implemented a data collection for maintaining a timeline. - Improved estimated arrival time calculation and handling, relying on the new collection. - Updated the French translation (thank you Fantomas). - Numerous minor improvements and fixes. Version 1.4.22 (release #29) - July 7, 2014 - Added support for the I2P address types introduced with I2P 0.9.12. - Limit size of outgoing datagrams to 10 KiB to increase reliability of transfer. - Provided a way to add an I2P address for Kademlia bootstrapping (through the main menu). - Do not publish keywords that are shorter than three chars. - Update the cached keywords whenever a file gets renamed. - Increased the width of two buttons on the language options panel. - Updated the French translation (thank you Fantomas). Version 1.4.21 (release #28) - June 19, 2014 - When running on Wine, print the version of Wine in the session log on startup and include it in crash logs. - Change the way asynchronous writing to network streams works, so that the application doesn't require .NET 2.0 SP1 or later, but runs on .NET 2.0 without any service pack (as was supposed). - Do not rely on TextBoxBase.ScrollToCaret(), since Wine 1.6.2 seems not to support it. - Prevent the .NET Exception Assistant/Exceptions dialog box after an unhandled exception happened, since it potentially allows the user to continue execution in an unknown state! - If SecIdent fails because the peer sent a bad signature, do not close the connection if the peer uses iMule and seems to be in the possession of the private key of the I2P address used on last contact. - Do not allow to change the datagram address or nickname of a peer before a potential SecIdent operation has finished. - In the native library, do not bogusly require WSAPoll() to be available for socket checking to work. Socket checking should now work on NT 5 and before (as was supposed). - Allow the user to set a preferred tab that gets pre-selected on startup (thank you Fantomas). - Allow the user to minimize the main window by pressing the escape key. Also allow to unlock the CTRL+Q key combination for triggering shutdown. Version 1.4.20 (release #27) - June 6, 2014 - Send the ET_MOD_VERSION tag in hello packets. - Disabled SecIdent version 1 for security reasons. Added a mechanism to work around a flaw in iMule's SecIdent version 2 support to allow it to be used instead. - Added the CPU's time stamp counter to the native library's random number generator. Allocate sensitive memory for the random number generator from the nonpaged memory pool if possible and reseed the random number generator when the system suspends or is resumed from suspended state in order to prevent leaking secrets to the hard drive (inspired by SQRL's entropy harvester). - Implemented the Keccak/SHA-3 hash function and the CRC32 error-detecting code. Also implemented a HMAC wrapper. - Write the first sector of a file in the last write operation when extracting a file, in an attempt to keep the file in an unusable state during extraction. This is done to increase the likelihood that the user notices if there is something wrong with the file in case the extraction was suddenly aborted ungracefully (crash/ power outage). - Changed the background color of dialogs and the frame colors of group boxes (now custom drawn) to increase readability (especially on Windows 7). Also added a mouse over effect to group boxes and made the UI more... uhm... yellow. - Limited the number of peers displayed on the "Peers" tab to 1,000 until a faster list implementation is available. - Attempted (with limited success) to work around problems of the broken .NET RichTextBox control so that programmatic scrolling produces the correct results even if the control is invisible during the operation. - Added the ability to monitor the status of the I2P router and request it to gracefully shut down to the GUI. - Made the German translation seem less like auto-translated instructions for ready-to-assemble furniture. Version 1.4.19 (release #26) - May 5, 2014 - Prevent a deadlock in Instance.DeleteElement() that often occurred on shutdown when the user had the "Save search history" option disabled. Thank you "UnknownUser" for giving details on how to reproduce the problem. - Encode spaces as "%20" instead of " " or "+" when building eD2k/magnet URIs (thank you "UnknownUser"). - Increased the forward compatibility regarding Nachtblitz collections. - Extended the version-information resource of the native library. Version 1.4.18 (release #25) - April 30, 2014 - Updated and extended the interface of the zlibManaged library. - Prevent a race condition in GetFilesByCategory(). - Fixed an initialization error in CreateFrameworkProvider(). - Publish sources with a higher priority than keywords and notes. Reduced the time a complete nodes search takes in order to speed up publishing. - Designed and um... designed own message box icons. Plugged a font handle leak in the message box code. Version 1.4.17 (release #24) - April 15, 2014 - Load the default text set as ready-made binary stream instead of a text file that needs to get parsed char by char. - Some translation strings are now (in .NET terms) interned. - Extended the list of known file extensions in order to take more executables into account (for security reasons). - Lifted the number of custom progress bar background images that can be used simultaneously to 32 (from 16). Images that have more than 2^24 (16,777,216) pixels are not accepted anymore. - Periodically update the text color on the search tabs. - Resume displaying the progress of selected files on the task bar when the main window gets restored after minimization to tray. - Designed and implemented an own progress bar control. - On the main menu, state the keyboard shortcut ALT+F4 explicitly as a way to exit the application (thank you Fantomas). - Increased the width of the combo box for file type selection on the search panel (thank you Fantomas). - Modified the way the transfer speed is presented in the title of the main window, so that it more likely fits the task bar. - Overhauled the SensitiveBuffer class. - Fixed a defect that potentially made the client crash in some cases (most likely during shutdown) when a file got extracted (e.g. after a download finished). - After a crash, show a message box that informs the user about what happened and that displays the path of the crash log. Version 1.4.16 (release #23) - April 7, 2014 - Removed a defect that could lead to a crash when the user changed the representation of data sizes or restored search parameters. - Removed the shutdown status indication again that was added in 1.4.15 for debugging purposes. Version 1.4.15 (release #22) - January 25, 2014 - Extended the list of known file extensions. - Increased robustness of interaction with SAM bridge. - Made content management shutdown more robust. - An integer indicating the status is now displayed during shutdown to aid in debugging. Version 1.4.14 (release #21) - January 19, 2014 - Provided a mechanism to check (anonymously and cryptographically secure) and inform the user if there is a newer version available. No auto-updating however. - Do not demand the peer's signature on connection build-up if there is currently another connection established that treats the peer as securely identified. This saves bandwidth, calculating power and prevents unnecessary use of the private key. Works only with Nachtblitz 1.4.14 and later (iMule doesn't really need it, owed to the A4AF limitation). - Strongly encourage the user to download a newer version on start-up when the started version is older than one year. - Give more detailed information on the number of active connections on the stats tab. Display how many are ingoing and outgoing. - Changed the way the estimated number of nodes in the network is displayed on the stats tab. - Accept OP_REQUESTFILENAME as another way to select a file (besides OP_SETREQFILEID). Also made file selection more flexible in general. - Correctly handle keyword id exclusion when starting advanced searches. - Concerning publishing, reduced the minimum required fitness of the client id and the id of the published object, so that a larger number of clients are valid targets in situations where the network has few nodes. Prevent a crash when there are 16 or more target nodes with a distance-fitness of at least five bits. - Relative time is now queried with optimal precision, allowing e.g. for more exact speed measurement. - Increased flexibility of text string interpretation regarding network streams. Actively handle BOM of UTF-8 and UTF-16. - Introduced a flexible way of writing text to streams, in that one of a variety of encodings is chosen so that the space required for a particular string gets minimized. - A number of buttons on the options window got wider. - Special thanks to Fantomas for testing. Version 1.4.13 (release #20) - January 3, 2014 - Fine polished changes of 1.4.12 to finally reach 100% Unicode-compatibility with iMule 2.3.2.3. Version 1.4.12 (release #19, private) - January 2, 2014 - Added Visual Studio project files to the source code to make it easier to build the application. - Removed errors that were about encoding the length of text in an incorrect way when writing a tag list. This affected strings that are not representable in the ASCII-encoding. - Compressed two more embedded resources in order to decrease binary size. Version 1.4.11 (release #18) - December 14, 2013 - Updated French translation. Also increased the size of two control elements on the options window so that they can hold larger texts. - Improved on the fly reordering of tabs in the case where the tab being dragged is narrower than the tab it's dragged over. Version 1.4.10 (release #17) - November 30, 2013 - Added a general Spanish translation thanks to lati2p. - Updated French translation. - Provided an optional way to immediately check if a stream-oriented network connection is already closed by means of the native library (Windows only), since the .NET framework doesn't allow for this without actually sending at least one byte. If that optional way of finding out is available, the client won't send short messages periodically just to test if a connection is still alive. - Improved the locking mechanism of the native library for performance reasons. - Made content management more robust and fixed code that could have potentially led to a crash (as in 1.4.9). - Fixed broken detection of files that are created or changed inside or moved into watched directories. Closed a potential memory leak that could occur when creating a file system watcher failed. - Hide some more tabs when the application runs for the first time to prevent confusing new users. Correctly adopt the result when the user reorders custom tabs within the files tab on the fly. - Fixed assembly of AICH recovery packets and made it compatible with iMule 2.3.x. The client crashed when a packet got assembled. - Fixed an error in ProcessSignature(). Wrongfully closed the connection if the peer sent the signature before the SecIdent state was processed. - Allow the opcode OP_SENDINGPART in EMULEPROT (as well as in EDONKEYPROT). - Implemented a dialog that can be used to test SAM bridge connectivity. It's automatically shown on first launch. - Increased the time that file sources are stored in the Kademlia index. - Limited the peer database to 10,000 entries. - Made the release notes accessible from the menu. - Translation file verification now warns if a language file is probably not encoded in UTF-8. - Include inner exceptions in crash log entries. Version 1.4.9 (release #16) - October 30, 2013 - Added support for one of the Windows 7 task bar features. The average progress of up to 64 items that are selected on the files tab is now reflected on the task bar. - Increased the width of two group boxes on the options dialog to prevent text truncation. - "Make Nachtblitz understandable by humans" by adding a simple mode to the user interface that hides away three tabs. When running for the first time, the application will start in "simple mode". The traditional ("advanced") mode can later be activated on the options dialog at any time. - Improved the custom tab control (page listing feature). - Slightly modified ETA calculation (it now takes compression into account). - Made content management more robust and fixed code that could have potentially led to a crash. - Improved the build-script of the native library. It doesn't rely on the presence of a specific version of the Microsoft Visual C run-time library (like MSVCR100.dll) on x86 anymore. - Implemented a native file io interface that might be somehow used in the unforeseeable future... - General code maintenance and minor improvements. Version 1.4.8 (release #15) - October 9, 2013 - Added a general French translation thanks to support by the community. - When starting the application for the first time, automatically load the text set that best fits the OS language (if such a translation is present). - Switched to the "GNU Affero General Public License, version 3" (AGPLv3) as the new main license of the project. - Designed and implemented a custom tab control that substitutes the outrageously buggy .NET TabControl class that was used so far. Thus finally removed the many workarounds that were needed to somehow make the old tab control work by constantly checking and repairing its frequently bogus internal structures from the outside. Also implemented an own tool bar control that the new tab control uses (and further helper objects). The new tab control introduces on-the-fly reordering as well as listing of tab pages. However, it does not support right-to-left orientation beyond text direction and icon position. - The client won't store the alleged datagram address (if present) anymore when receiving eD2k sources and will utilize it only for instant checking. (As version 1.4.7 already behaves when launched on July 2013 or later.) - Allow pings to carry minimal custom data that will be ponged back. - Designed and implemented a secure random number generator that is used as a replacement of the operating system provided RNG on Windows, as a response to the BULLRUN program. Improved the native library's code. The native library now requires NT 5.0 or later. - Build-scripts now contain more specific compiler/linker options. Additionally, the .NET Runtime (v4.5 and later only) will now use randomized string hash codes, making string related hash collision attacks more difficult to mount. - Do not always generated exactly 4,096-bit RSA keys, but use a more random key size, so that it should be less fruitful to optimize an attack for a certain key size. See: - Prevent the operating system from going to sleep mode while the client is transferring (Windows only). - Prevent a crash that could occur right on startup in relation to the progress bar background feature (bogusly tried to instance an image with zero size). - Made SecIdent handling more robust. - Added an Easter egg for Xmas and New Year. - Several minor improvements. Version 1.4.7 (release #14) - April 16, 2013 - Changed the default application data folder from the system user profile's roaming folder to the local folder. The application data should not roam by default, since it's usually too big and there are security reasons to keep it local. - Provided a way to communicate a revision number higher than seven (we will need it) through the eD2k protocol when saying hello. - Enhanced the file request operation for Nachtblitz 1.4.7 and later, enabling exchange of the native (8 MiB) completion bitmap instead of a downscaled eD2k (9,500 KiB) bitmap. Also made it possible to use file size and AICH/TAICH hash to identify a file in greater detail when requesting, allowing for cryptographically safe file identification. - Removed an error that could lead to a bogus set bit count of a (completion) bitmap. Also got rid of a defect that could cause a partially downloaded file to be overlooked when picking files that are ready for publishing (in rare situations). - Changed the way threads work together when a file gets hashed, so that access patterns are more consequent and the hard drive is less load burden. - Increased the critical available disk space threshold where downloading is suspended from 375 to 512 MiB. - When extracting on download completion, allocate the entire required file size at once instead of growing the file step by step on write (for performance). - Do not require the datagram address to be present when receiving source search results. - Lifted the internal maximum upload speed limit of 24 KiB/s per connection (that was meant to prevent a 'silly window syndrome'), because the related problem seems not to occur anymore with latest I2P releases. - Removed a defect possibly leading to a (never observed) crash when a certain malformed ASN.1 encoded RSA keys got parsed. - Always mark the graphical representation of search result items as dirty after the appropriate item color was determined. Previously the refresh didn't reliably happen, sometimes leaving items uncolored or colored incorrectly. - Improved the way time is displayed by the GUI. - Improved the admittingly confusing way how the completed quantity of an incomplete file is displayed. The user can now get a tool tip on the details tab that says it all. - Use double s instead of eszett if the general German translation is used and the startup-culture is German of Switzerland/Liechtenstein. - Added process specific CPU time and CPU usage to the stats tab. - Changed the preferred .NET runtime version from 2.0 to 4.0 (while retaining full compatibility with .NET 2.0). Version 1.4.6 (release #13) - March 10, 2013 - Added a mechanism to fix certain incoming strings that already contain errors that stem from interpreting an UTF-8 encoded string as ISO-8859-1 encoded. However, it won't be able to remove the whole variety of related errors in file names that circulate through the network. - Removed an error that could lead to ISO-8859-1 compatible strings being written in the aforementioned encoding where full compatibility of the output with the UTF-8 encoding was expected, but not necessarily achieved (for code points 0x80 to 0xFF). - Removed an error leading (in theory) to a crash that could occur when a running search was aborted, then manually stripped of results and afterwards restarted. - Detect if it's a bad time for a file source search before starting it and detect if a search that ends went well or should be repeated and take appropriate action. - When shutting down, only compact if there will be a more than six percent decrease in (application data) file size. - Include the file size when publishing the client as a file source and when publishing own notes to a file. - Zero possible references when releasing slots in a FlexibleArray to allow the garbage collector to do its job. - Fixed writing blob tags. - Made access to certain brushes that are shared by the network and the GUI thread thread-safer. - Employed the SipHash for another time in order to prevent hash collision attacks from working. - Changed the font used on the log and stats tabs and increased its size. - Adopted the factory tunnel configuration of iMule as default setting. - Include runtime and framework version in crash logs. Version 1.4.5 (release #12) - February 4, 2013 - In order to make the application safe against hash collision attacks, the SipHash hash function is now employed in some situations. Additionally UInt128s got their own random seeded way of hashing. Watch: - Implemented the SHA-256 (SHA-2) hash algorithm in native and managed (so called) "unsafe" form in order to speed up hashing. Lowering the required framework version to 2.0 with the release of Nachtblitz version 1.3 had the downside of typically relying on a quite slow framework provided SHA-256 implementation that could impair performance significantly. Also improved the native library's C code here and there (added the const keyword). - Respond to a change of the selected file on the files tab without noticeable delay. Implemented a cross-thread callback mechanism for this purpose. - Send the large file support flag when saying hello. This should improve compatibility with iMule 2.3 when transferring files that are about 4 GiB in size or larger. - Removed an error in ProcessSourcesAnswer(). - Display speed with one fractional digit at most (instead of two digits). - Changed the default configuration so that the client auto-connects to the SAM bridge by default. - Changed the application icon for small dimensions (64x64 pixels and below), so that the lightning appears bolder. - Codefiles are now released in ISO-8859-1 (latin1) encoding instead of UTF-8 with BOM. Non-latin1 characters are not supposed to be in the code anyway. Version 1.4.4 (release #11) - December 29, 2012 - Added direction glyphs on list view column headers to indicate the sort order. - Prevent an unhandled exception that could occur while translating hash codes into bucket indices. - Fixed the overflow check that's used when parsing decimal strings. - Closed a memory leak that occurred when closing tcp connections. Version 1.4.3 (release #10) - November 18, 2012 - Added an assembly manifest to the code in order to declare the application as dpi aware, so that the visuals don't mess up on Windows Vista and later in certain situations. - Changed how owner drawn progress bars in list views look. Owner drawing now takes the border style of a list view into account. - Increased the icon size for resolutions larger than 96 ppi. - Changed the default configuration so that 15 files are attempted to be downloaded simultaneously instead of 10. - Got rid of an error that could crash the application when a list view got updated. Version 1.4.2 (release #9) - October 22, 2012 - Fixed broken source query from local storage. - Removed an error that was responsible for a possible dullness of incomplete files with nearly 100% completeness. - On the file search panel: Start a search when the user presses enter while the input focus is on a search text box. And start filtering when the user presses enter while the input focus rests on the file name filter text box. Same effect as one gets by pressing the corresponding buttons. - Provided a workaround for defects that can occur when inserting or selecting tab pages. The defects could make releases 1.4.0 and 1.4.1 crash when working with tabs. The problem is that the framework doesn't always maintain TabPageCollection and ControlsCollection correctly. - Closed a memory leak that occurred after reordering custom tabs. - Better support for clients with a A4AF (asked for another file) limitation. Do not bother them with more than one file request. Expect unknown peers to have the A4AF limitation by default. - Do not make multiple simultaneous connection attempts regarding the same destination if this destination wasn't connected for a while. - Improved displaying the number of outgoing connections on the peers tab. - Changed the way list views are sorted to something more intuitive. - Removed a defect that caused SecIdent not to work correctly for the case where the user creates a new eD2k persona while a connection is up. - Several minor changes and performance improvements. Version 1.4.1 (release #8, private) - October 16, 2012 - Got rid of a defect in the single-writer/multiple-reader semantics. - Changed the default configuration of the client so that it automatically starts downloading files that are added to the list of incomplete files. - Switched the iMule compatibility target from version 1.4.5 to 2.3.2. - The Kademlia implementation now expects normal strings to be encoded in UTF-8 instead of latin1. Version 1.4.0 "Mitternacht" (release #7, private) - October 14, 2012 - Increased the height of the misc group box of the advanced options page to make the check box for the complete file deletion feature visible in release builds that sadly remained invisible in 1.3.x. - Removed an error that could occur (randomly) when enumeration bit runs. This error was responsible for a possible dullness of incomplete files with nearly 100% completeness. - Do not use the GUI thread for shutting down anymore, use an own thread instead and make the GUI show a wait message with a progress bar while compacting data files. - Also use the wait message with progress bar in a number of other situations to make the GUI more lively. - Added custom message boxes that can be closed programmatically while shown. Message box buttons are now translatable. - User generation from within the options dialog can now be aborted. - Do not display a missing file's completeness bar as filled in the details panel. - Removed a problem that made it impossible to successfully move data files on Mono (Mono seems not to support asynchronous file io). - Enable the user to import part files from iMule and to import the list of shared directories from that client. Feature tested with iMule 1.4.5 and 2.3.2. - Added a tag class for Mule's TAGTYPE_UINT64UINT64. - Removed nearly all try-blocks where an exception is never supposed to be catched and where the only reason for the try-block was a finally-block. - Removed all uses of the lock keyword, since we never need the exception safety it incorporates. It's also not well portable. - Completely rewrote the single-writer/multiple-reader semantics (Resource class and derivates). - Changed large portions of the incomplete file handling to increase data file robustness and performance. - Re-check the file attributes when scanning the shared directories for changes. - Enable the user to decide if files with the hidden or system attribute should be shared. - Embed the seldom needed license in compressed form instead of plain text (decreases the binary size by about 25 KiB). - Provided a way to copy all text of a translation into the clipboard to ease spell checking. - Added contact information to the about dialog. - Gave the user control over the network behaviour regarding Unicode. - The user can now adjust the auto sorting threshold for list views, that had been hard coded to 200 items so far. - When a peer or transfer is double-clicked at in the corresponding sub-tabs of the files tab, the GUI jumps to the general peers tab and selects the fitting peer. - Friends are now listed in blue text colour in the general peers tab. - The first four function keys (F1 to F4) can now be used to jump to one of the first four primary tabs of the main window. - The keyboard's F9 and F12 keys can now be used to enable/disable downloading of selected incomplete files (files panel). - The F9 shortcut also works from the search tab now in that it adds a file to the list of incomplete files. - Files can now be assigned to a custom tab directly from the file search tab using the context menu. - Prompt for confirmation before closing all search tabs. - Decreased the maximum number of search tabs from 256 to 64. Any surplus search tabs are dropped automatically when loading. - When a file is double-clicked on in one of the file tabs, it's now the same as using the context menu to open the containing folder of that file. The user can change this behaviour (options dialog) and make the client open/preview a file directly when it's double-clicked on. The space key can now be used to get the same effect as from a double-click. - Improved the shared directory panel (options dialog). - Improved the license dialog, so that it can be resized and maximized. - Display only the 32 most significant bits of the distance on the Kademlia tab. - Deactivate discrimination of file names that only differ by casing by default. The application will automatically enforce this when loading and inform the user (log and balloon) if the list of shared directories had to be adjusted because of this. - Limited shared directory recursion to 128 directory levels (was unlimited before). - Make sure file names taken from links conform to our constraints. - Do not index keywords of files larger than 12 TiB and don't find such files. Also reject collections that contain any such file. Transferring a file beyond 12 TiB is not feasible currently. - Be more forgiving when loading data at startup that seems odd in order to increase robustness. - The user can now adjust the reputation of peers and ban them manually. It's not enabled by default (options dialog). - Implemented a custom split container, since the framework's implementation wasn't convincing. This also squashed glitches that sometimes occurred when maximizing the main window caused by the frameworks TabControl class (a source of loads of problems). - Finally implemented a custom dictionary optimized for values that are .NET structs (so far a slow preliminary solution was in use). - Implemented a block cache in order to speed up hashing of large files. - Custom background images can now be employed to enhance the look of the completion bar on the details panel. - Spread icons (by the artist aipotuDENG) throughout menus and tab controls. The user can customize the background color of icons. - The user can now beautify custom tabs with a fitting icon and color. - Do not show all custom tabs after starting, instead apply the visibility state of the previous session (as was supposed). - Allow the user to reorder custom file tabs and search tabs (using a dialog, since the .NET tab control doesn't support on the fly reordering). The user can use this dialog also for reordering columns of list views (though that works on the fly). - Fixed the speed limit input control for the case where the maximum value is set numerically (about 4 GiB/s). In this case there was an overflow to zero. - Increased the maximum number of UTF-16 code units the name of a custom file tab can have from 32 to 64 with respect to written languages that need several code units to form one code point. - The application now remembers if the main window was in maximized state when the previous session ended and restores this when starting up. - Further improved forward compatibility regarding the data file format. - Improved the mechanism that collects data used for quick detection employed when a file is flushed to disk after a download finished. This should turn files from incomplete to complete without appearing as missing for a noticeable time in between. - Inform users at startup that an update is probably available when a release is 180 days old. - Removed an error that was about an omission of bookkeeping that occurred when renaming a complete file through the application's user interface (the issue probably existed since 1.0.0). - Enabled the user to rename files with a full file name longer than 247 UTF-16 code units through the application's user interface on Windows (via P/Invoke). Also employed P/Invoke when retrieving file attributes and file time as well as when deleting a file in oder to get around the framework's path length limitation. - Prevent a crash that occurred when a external renaming operation concerning a file with a very long file name was detected (uncatched PathTooLongException). - Enable renaming of missing files. Actually only the application's concept of the file gets renamed as the file itself is, uh missing. - Only hold an abbreviated text form of known I2P addresses in memory, since the full text form (occupying 516 UTF-16 chars) is rarely needed (mainly when talking to the SAM bridge). Address handling was improved in general. - Resume network activity quicker after a disk full situation. - Most dialogs now support large desktop bounds (before dialogs were designed for a small working area). - Allow redundant number tags in tag list as long as such number tags are completely identical. This allows Nachtblitz to interact with iMule 2.3 which tends to repeat the same tag (e.g. two file sizes). - Got rid of an error concerning a possible crash when processing a keyword entry that has no file name tag (never observed in the wild). - Hundreds of minor changes and some code clarifications. Version 1.3.1 (release #6) - August 15, 2012 - Removed several defects that prevented re-verifications of incomplete files to work efficiently. - Check for file chunks that are ready for verification and trigger verfication when looking for a chunk that needs to be downloaded (resolves the possible dullness issue that occurred after switching from eD2k to TAICH hash-set). - Correctly abort extraction if a downloaded file is found to be identical with another, already existing shared file. - Ignore files in shared directories that have the system file attribute (1.3.1 only). - Correctly calculate the number of missing and incomplete files that are dropped via context menu in order to fix the message the user gets. - Do not change the font of the log window when a log message contains an Asian character. Version 1.3.0 (release #5) - June 20, 2012 - Switched the compiler from csc.exe v4.0.30319.1 (v4.0 framework) to v8.00.50727.4927 (v2.0.50727 framework), to reach compatibility with .NET v2.0 to v3.5. Added a .NET config file to the binary distribution to achieve compatibility with all .NET frameworks and runtimes from v2.0 to v4.5. The log now contains the runtime and framework versions when starting the client. - Introduced Mono (v2.10.8) compatibility (as far as it gets). - Enabled the user to tell where to store application data, preview files and temporary files. Application files are moved to a new location if desired. - Introduced a way to delete complete files from the file system (or move to recycle bin) through the context menu of the "Files" tab. - Introduced customizable list font size and grid style. - Auto focus list views when the corresponding tab is selected. - Only scan shared directories periodically if the user allows the application to watch the file system for changes. If not, a scan will only happen if it's manually triggered. - Allow the user to fine tune publishing (source, keywords, notes). - Do not publish files that have an upload speed limit near zero. - File search results can now be copied to the clipboard (in text form). - Improved forward compatibility regarding the data file format. Version 1.2.1 (release #4) - May 27, 2012 - Removed a defect that lead to a crash when trying to look up sources of a file that is indexed locally. - Removed a defect that lead to corruption of the block buffer when doing Tiger hash operations in managed code. - Improved performance of zlibManaged. - Improved publishing. Version 1.2.0 (release #3) - May 25, 2012 - Introduced translation support. Provided the German translation. - Introduced smooth ETA calculation (weighted moving average of the last 32 seconds). - Assigned a user defined culture to the GUI thread, while all other threads get the invariant culture assigned (to avoid side effects of workers having a strange culture). - Increased performance of some hash function implementations. - Reduced memory consumption of inactive files. - Introduced a (simple) cost-benefit analysis before compacting on shutdown. - The stats now only indicate the managed memory consumption, since the private memory allocation displayed before wasn't reliable. See: - Got rid of a defect in the "Copy Stats to Clipboard" feature (it only worked well while the stats tab was visible). - Use local Kademlia index when looking for file sources and performing keyword searches. - Suspend downloading/hashing if the amount of available disk space falls below a critical point (375 MiB). - Alert the user (periodically) with a balloon tool tip and/or a log entry if one of the following events occurred: a) a connection to I2P router was built, but there are no known Kademlia contacts; b) a file was downloaded, but couldn't be written to an output directory since no such directory was defined; c) a file was downloaded but couldn't be written to an output directory since there is not enough free disk space left; d) downloading/hashing was suspended due to lack of free disk space. - Removed a defect that could (depending on details) crash the application if a nodes file was manually loaded while there was no connection to Kademlia. - Removed defects that could have (not actually observed) lead to crashes if a certain kind of malformed TagList was interpreted. - Corrected spelling. Version 1.1.0 (release #2) - May 5, 2012 - Fixed dispatching of OP_ANSWERSOURCES. - Fixed handling of OP_REQUESTFILENAME when iMule uses it to initially select a file for downloading. - Improved handling of OP_END_OF_DOWNLOAD in the situation where a download was requested right before. - Do not close the connection if someone wants to browse the shared files (even though our hello packet says it's not allowed). Send OP_ASKSHAREDDENIEDANS instead. - Do not overwrite the creation date of an existing I2P private key when connecting to the SAM bridge. - Introduced validation of I2P destinations (still limited). - Created a way to manually add sources for downloading. - Created a main window tab for viewing UserContext instances and toggling the friend status. - Improved un-banning of peers. - Fixed length check on BufferIO reads. - Load own comment as null instead of string.Empty. - Dropped nearly all uses of DateTime, using the custom type Time instead. - Several minor changes and code clarifications. Version 1.0.0 (release #1) - April 30, 2012 - Initial release.