XNap TODOs (sorted by priority)

RELEASE CRITICAL

THIS RELEASE

* update Kunststoff L & F

NEXT RELEASE

TOFIX

* update transfer table after AutoDownloadEditorDialog has modified
  filename
* update server table after server properties were modified
* remove files from search tree when removed from repository
* OpenNap: shared files range in server object is not updated if elements
   are added to repository after connecting
* incomplete files are locked on WinXP
* Time Left doesn\'t reset properly after stalled d/l or u/l resumes (?)

2.5

* integrate the firewall test script (http://xnap.sf.net/checkFirewall.php).
* thread double filtering away and show progress
* allow plugins to filter files to share
* relay creation of MultiDownload instances to some kind of factory
* rethink throttle semantics if plugins don't allow handling it globally
* allow peer specific downloads
* queuing of uploads can't be handled globally
* do away with SimpleUpload hacks in UploadQueue
* allow searches in specific network or group of networks
* relay grouping to the plugins
* allow a variable number of meta information tags / maybe an extra panel
* implement a treetable model for searchresult and download views
* maybe use that treetable for the OpenNap server table and improve connector
* searchsubpanel uses a SearchResultCollector instead of ISearchResultCollector
* adjust popup positions if not enough space on screen
* add requery button in search panel
* OpenNap: don't send MAX_RESULTS in search query
* OpenNap: add dequeeuing
* OpenNap: remove servers when failed 10 times
* register table models in preferences menu
* honor and send data port error messages
* implement MRJapp stuff, we need that iBook
* don't share files with zero size
* optimize ShareFileMessage, don't determine mediaType every time
* merge library search and global search
* figure out why cpu load == 100% when updating repository/logging in:
* synchronize SearchResultCollector.
* implement swing list listener to handle multiple inserts at once
* when double filter is modified, the modified filter is used exclusively,
  maybe we should merge the original filter and the double filter.
* rewrite search architecture, enable passive searching, register
  SearchResultCollectors, remove threading
* subscribe queued users to server hotlist to remove download when
  user goes offline
* use chat console as global console
* Write webalizer-style log file
* implement chat commands
* Complete SearchFilterData changes
* dump status quark, replace with StateController
* reduce search load on servers.
* nap: customize client per server
* HistoryTextField: entries triggered by the send button don't go to the 
  history
* HistoryTextField: Implement history search
* add key binding to focus search boxes
* add prefs
  - configure auto complete mode
  - download retry count down
o [bflat1] write documentation for Emacs bindings
* implements priorities for upload queue and show queue position
o [leist] write help documents (step-by-step instructions, user manual)
* option to abort download if transfer rate below X
* add support for meta-redirect server.
* reconsider whether appending .X to duplicate files is still sensible.
o [leist] allow searching for unavailable files.
* use plugin meta information instead of instantiating plugin classes
* show number of actually downloading files. (2/8 = 2 downloading, 8 queued)
* iTunes support through apple script

2.6

* add skin look and feel
* any download
* error.log handler
* support for nap style alias file
* remember last shown pane when XNap is closed
* rename nap to opennap
* private ip filter

DESIGN

* collect all the servers a peer is connected to for better dls
* clean up new dl concept and implement multisource dl using nio
* link speed (-> use something more generic like kb/s)
* get OpenNap linked servers and WinMX peer cache
* implement WPNP
* implement giFT
* implement DCC
* determine icon size depending on screen resolution
* replace expand icon

NICE TO HAVE

* fine grained throttle settings (byte / s)
* implement drag and drop for file moving and queueing
* colorful table entries in server table
* add search details


HARD TO FIX

* fix l&f update

NEXT MAJOR VERSION 

* have a real plugin architecture with dependency troubles
* write opennap admin plugin
* write playlist plugin
* write dc plugin (http://freshmeat.net/projects/dctc/)
* add multiple concurrent downloads of the same file
* store a text file with all known information (path, users...) along
  with a download
* add "more sophisticated automation" features like scripting


UNRESOLVED EXCEPTIONS

* don't know where
java.lang.NullPointerException
        at
xnap.plugin.nap.net.msg.MessageHandler.handle(MessageHandler.java:127)
        at xnap.plugin.nap.net.Server.run(Server.java:648)
        at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
        at
xnap.plugin.nap.net.msg.MessageHandler.handle(MessageHandler.java:127)
        at xnap.plugin.nap.net.Server.run(Server.java:648)
        at java.lang.Thread.run(Unknown Source)

* don't know where
Exception occurred during event dispatching:
java.lang.IllegalArgumentException: component not found in tabbed pane
        at javax.swing.JTabbedPane.setSelectedComponent(Unknown Source)
        at
xnap.gui.ToggableIconPane.setSelectedComponent(ToggableIconPane.java:213)
        at
xnap.gui.ToggableIconPane.setSelectedComponent(ToggableIconPane.java:207)
        at
xnap.gui.XNapFrame$ViewActionListener.actionPerformed(XNapFrame.java:1059)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown
Source)
        at
javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Unknown
Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown
Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.AbstractButton.doClick(Unknown Source)
        at
javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseReleased(Unknown
Source)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown
Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown
Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown
Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

* delete share
java.lang.NullPointerException
        at xnap.gui.DirectoryList.valueChanged(DirectoryList.java:91)
        at javax.swing.JList.fireSelectionValueChanged(JList.java:1318)
        at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1332)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:187)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
        at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:214)
        at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:544)
        at javax.swing.plaf.basic.BasicListUI$ListDataHandler.intervalRemoved(BasicListUI.java:1560)
        at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:160)
        at javax.swing.DefaultListModel.removeElement(DefaultListModel.java:364)
        at xnap.gui.DirectoryList$RemoveAction.actionPerformed(DirectoryList.java:129)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1767)
        at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1820)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:419)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:257)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:258)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:227)
        at java.awt.Component.processMouseEvent(Component.java:5021)
        at java.awt.Component.processEvent(Component.java:4818)
        at java.awt.Container.processEvent(Container.java:1380)
        at java.awt.Component.dispatchEventImpl(Component.java:3526)
        at java.awt.Container.dispatchEventImpl(Container.java:1437)
        at java.awt.Component.dispatchEvent(Component.java:3367)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3214)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2929)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2859)
        at java.awt.Container.dispatchEventImpl(Container.java:1423)
        at java.awt.Window.dispatchEventImpl(Window.java:1566)
        at java.awt.Component.dispatchEvent(Component.java:3367)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:445)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:144)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:130)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:98)


* happened quite often when switching chat panels, seems Kunstoff related.

java.lang.NullPointerException
	at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:48)
	at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:715)
	at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2782)
	at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:726)
	at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:722)
	at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2782)
	at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2772)
	at javax.swing.ImageIcon.paintIcon(ImageIcon.java:322)
	at javax.swing.plaf.basic.BasicButtonUI.paintIcon(BasicButtonUI.java:306)
	at javax.swing.plaf.basic.BasicButtonUI.paint(BasicButtonUI.java:248)
	at com.incors.plaf.kunststoff.KunststoffButtonUI.paint(KunststoffButtonUI.java:21)
	at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
	at javax.swing.JComponent.paintComponent(JComponent.java:537)
	at javax.swing.JComponent.paint(JComponent.java:804)
	at javax.swing.JComponent.paintChildren(JComponent.java:643)
	at javax.swing.JComponent.paint(JComponent.java:813)
	at javax.swing.JComponent.paintChildren(JComponent.java:643)
	at javax.swing.JComponent.paint(JComponent.java:813)
	at javax.swing.JComponent.paintChildren(JComponent.java:643)
	at javax.swing.JComponent.paint(JComponent.java:813)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:552)
	at javax.swing.JComponent.paintChildren(JComponent.java:643)
	at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4742)
	at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4688)
	at javax.swing.JComponent.paint(JComponent.java:794)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1268)
	at sun.awt.RepaintArea.paint(RepaintArea.java:180)
	at sun.awt.motif.MComponentPeer.handleEvent(MComponentPeer.java:339)
	at java.awt.Component.dispatchEventImpl(Component.java:3586)
	at java.awt.Container.dispatchEventImpl(Container.java:1582)
	at java.awt.Window.dispatchEventImpl(Window.java:1581)
	at java.awt.Component.dispatchEvent(Component.java:3367)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:445)

* search
java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.next(HashMap.java:736)
        at xnap.io.Repository.search(Repository.java:160)
        at xnap.plugin.nap.util.NapFileHelper.getRepositoryFile(NapFileHelper.java:101)
        at xnap.plugin.nap.net.msg.server.UploadRequestMessage.received(UploadRequestMessage.java:83)
        at xnap.plugin.nap.net.msg.MessageHandler.handle(MessageHandler.java:144)
        at xnap.plugin.nap.net.Server.run(Server.java:843)
        at java.lang.Thread.run(Thread.java:484)

DEAD LOCKS

* dead lock

MessageSender.add() <-- synchronized
MessageSender.send()
Server.updateChannels()
ChatGlobalSubPanel.elementAdded()
AWTEventQueue


AutoDownload